2015-06-04 21 views
3

У меня есть список объектов со следующими свойствамиОтдельный список с помощью LINQ

public class Class1 
{ 

    public Int64 Id 
    { 
     get; 
     set; 
    } 

    public Decimal? Amt 
    { 
     get; 
     set; 
    } 
} 

Я создаю список объектов с указанными выше свойствами

List<Class1> n = new List<Class1>(); 

Class1 a = new Class1(); 
Class1 b = new Class1(); 
Class1 c = new Class1(); 
Class1 d = new Class1(); 
Class1 e = new Class1(); 
Class1 f = new Class1(); 

a.Id = 1; 
a.Amt = 50; 
n.Add(a); 
b.Id = 2; 
b.Amt = 500; 
n.Add(b); 
c.Id = 1; 
c.Amt = 150; 
n.Add(c); 
d.Id = 2; 
d.Amt = 450; 
n.Add(d); 
e.Id = 1; 
e.Amt = 250; 
n.Add(e); 
f.Id = 2; 
f.Amt = 350; 
n.Add(f); 

Я хочу, чтобы сгруппировать все объекты с один и тот же идентификатор в один список и создать с ним другой список. Я попытался использовать GroupBy. но в этом только первый объект с тем же идентификатором возвращается.

Это то, что я пытался

List<Class1> m = n.GroupBy(x => x.Id).Select(x => x.FirstOrDefault()).ToList(); 

ответ

3

, если вам нужно все объекты с одинаковыми идентификаторами, создать список списков

List<List<Class1>> m = n.GroupBy(x => x.Id) 
         .Select(x => x.ToList()) 
         .ToList(); 
1

Вы группирование правильно, но вы должны знать, у вас есть более одной дублированной группы:

var n = new List<Class1> 
{ 
    new Class1{ Id = 1, Amt = 50 }, 
    new Class1{ Id = 2, Amt = 500 }, 
    new Class1{ Id = 1, Amt = 150 }, 
    new Class1{ Id = 2, Amt = 450 }, 
    new Class1{ Id = 1, Amt = 250 }, 
    new Class1{ Id = 2, Amt = 350 }, 
}; 

var groups = n.GroupBy(x => x.Id); 
foreach (var group in groups.Where(g => g.Count() > 1)) 
{ 
    Console.WriteLine("You have {0} items with ID={1}", group.Count(), group.Key); 
} 

Если вам просто нужны дублированные значения, вы также можете сделать это:

var duplicated = n.GroupBy (i => i.Id)   // your grouping key 
        .Where  (g => g.Count() > 1) // just duplicated items 
        .SelectMany(g => g)    // flatten those items 
        .ToList (); 
Смежные вопросы