我有以下问题:需要组aList<Tuple<object, int, int>>其中,对于不同的元素,项3等于项2,如果有任何不匹配的元素,它们应该保持在当前位置!
更具体地说List<Tuple<UserDescription, userId, inviterId>>
我试过用不同的方法处理LINQ-group-by,select,where,但是没有成功。。。。

var list = new List<Tuple<object, int, int>> // item2 - UserId, item3 - InviterId
    {
        new Tuple<object, int, int>(new { Name = "Ivan" }, 1, 12),
        new Tuple<object, int, int>(new { Name = "George" }, 2, 3),
        new Tuple<object, int, int>(new { Name = "Phil" }, 3, 12),
        new Tuple<object, int, int>(new { Name = "John" }, 4, 3),
        new Tuple<object, int, int>(new { Name = "Giggs" }, 5, 1),
        new Tuple<object, int, int>(new { Name = "Higgins" }, 6, 1)
    };

预期的结果应该是分组元组。
Ivan应该保持当前状态,因为没有用户id为12的用户。
他下面应该是吉格斯和希金斯,因为他们的邀请者id是1(伊凡的用户id)等等结果:
Ivan (user id = 1)
 Giggs (inviter id = 1)
 Higgins (inviter id = 1)
Phil (user id = 3)
 George (inviter id = 3)
 John (inviter id = 3)

最佳答案

好吧,您可以按邀请者id分组,然后循环遍历原始列表并匹配用户id与邀请者id匹配的位置,如下所示:

        var list = new List<Tuple<object, int, int>> // item2 - UserId, item3 - InviterId
        {
            new Tuple<object, int, int>(new { Name = "Ivan" }, 1, 12),
            new Tuple<object, int, int>(new { Name = "George" }, 2, 3),
            new Tuple<object, int, int>(new { Name = "Phil" }, 3, 12),
            new Tuple<object, int, int>(new { Name = "John" }, 4, 3),
            new Tuple<object, int, int>(new { Name = "Giggs" }, 5, 1),
            new Tuple<object, int, int>(new { Name = "Higgins" }, 6, 1)
        };

        var groups = list.GroupBy(i => i.Item3);
        var groupedList = new List<string>();

        foreach (var user in list)
        {
            //I'm assuming you actually want to display / store the data as per your results
            var propInfo = user.Item1.GetType().GetProperty("Name");
            groupedList.Add(propInfo.GetValue(user.Item1, null).ToString() + " (user id = " + user.Item2 + ")");
            var group = groups.Where(grp => grp.Key == user.Item2).ToList().SelectMany(g => g);
            foreach (var inviter in group)
            {
                groupedList.Add(propInfo.GetValue(inviter.Item1, null).ToString() + " (inviter id = " + inviter.Item3 + ")");
            }
        }

        // display items in list
        foreach (var item in groupedList)
        {
            Console.WriteLine(item);
        }

这将显示如下结果:
c# - 如何使用3个项将元组列表分组,其中element.item3 == element2.item2-LMLPHP

07-26 09:18
查看更多