使用LINQ分离列表
本文关键字:列表 分离 LINQ 使用 | 更新日期: 2023-09-27 17:53:34
我有一个具有以下属性的对象列表
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);
我想将所有具有相同Id的对象分组到一个列表中,并以此创建另一个列表。我试过使用GroupBy。但在这里,只有第一个具有相同id的对象返回。
这是我尝试过的
List<Class1> m = n.GroupBy(x => x.Id).Select(x => x.FirstOrDefault()).ToList();
如果需要使用相同Id的所有对象,则创建一个列表的列表
List<List<Class1>> m = n.GroupBy(x => x.Id)
.Select(x => x.ToList())
.ToList();
您的分组是正确的,但是您必须注意您有多个重复的组:
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 ();