Вот моя попытка. ПРИМЕЧАНИЕ. Этот код предполагает, что в вашем списке указано = UserId.
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 grouped = list.ToLookup(t => t.Item2);
var withInviter = grouped.Select(grp => Tuple.Create(list[grp.Key], grp));
var sorted = withInviter.OrderBy(t => t.Item1.Item2);
Редактировать: извините, но, как только я прочитал ваш пример снова, я вижуЯ неправильно понял, какие результаты вы ищете.Мне кажется, что пользователей можно разделить на приглашенных и не приглашенных?Я обновлю свой ответ, так как он неправильный.
Редактировать 2: Этот должен работать:
struct InviterAndInvited {
public Tuple<object, int, int> Inviter;
public IEnumerable<Tuple<object, int, int>> Invited;
}
public static void Main(string[] args)
{
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 byInviter = list.ToLookup(u => u.Item3);
var inviterInveted = list
.Where(user => byInviter.Contains(user.Item2))
.Select(user => new InviterAndInvited() {
Inviter = user,
Invited = byInviter[user.Item2]
} );
foreach (var grp in inviterInveted) // Print results
{
Console.WriteLine(grp.Inviter.Item1);
foreach (var user in grp.Invited) {
Console.WriteLine("\t" + user.Item1);
}
}
}
Редактировать 4: Изменен GetOrDefault на []