我有以下问题:需要组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);
}
这将显示如下结果: