C# 使用Linq根据属性构造不同的、有序的对象
我有一个C# 使用Linq根据属性构造不同的、有序的对象,c#,linq,C#,Linq,我有一个IEnumerable,我想构造一个IEnumerable,其中包含每个唯一的条(按ID排序,但我可以自己处理该部分) 我觉得这就是LINQ的任务类型……但我似乎不知道如何实现它 例如,如果我有: class Foo() { public Bar [] bars; } class Bar () { public string name; public int id; } 我希望我的linq声明返回: foo[0] => bars { { name = "
IEnumerable
,我想构造一个IEnumerable
,其中包含每个唯一的条(按ID排序,但我可以自己处理该部分)
我觉得这就是LINQ的任务类型……但我似乎不知道如何实现它
例如,如果我有:
class Foo()
{
public Bar [] bars;
}
class Bar ()
{
public string name;
public int id;
}
我希望我的linq声明返回:
foo[0] => bars { { name = "one", id = 1 }, { name = "two", id = 2 }, { name = "three", id = 3 },
foo[1] => bars { { name = "four", id = 4 }, { name = "four", id = 4 }
使用
SelectMany()
或Concat()
将子项组合成一个,使用Distinct()
使其唯一。使用SelectMany()
或Concat()
将子项组合成一个和Distinct()
使它们独一无二。如果您的条
类覆盖了等于
和GetHashCode
,这将非常简单:
Foos.SelectMany(foo => foo.bars).OrderBy(bar => bar.id).Distinct()
如果没有该相等实现,您将需要创建自己的IEqualityComparer
以传递到Distinct
方法中
如果您只需要关心id
来区分它们,您可以使用DistinctBy
from来简化您的生活:
var values = foo.SelectMany(f => f.bars)
.Distinct()
.OrderBy(b => b.id);
或者,您也可以使用匿名类型作为快速破解,以获得两个值之间的相等比较器,但仍使用MoreLINQ:
var values = foo.SelectMany(f => f.bars)
.DistinctBy(b => b.id)
.OrderBy(b => b.id);
几乎可以肯定的是,在
Bar
中实现相等会更好:)如果您的Bar
类覆盖了Equals
和GetHashCode
,这将非常简单:
Foos.SelectMany(foo => foo.bars).OrderBy(bar => bar.id).Distinct()
如果没有该相等实现,您将需要创建自己的IEqualityComparer
以传递到Distinct
方法中
如果您只需要关心id
来区分它们,您可以使用DistinctBy
from来简化您的生活:
var values = foo.SelectMany(f => f.bars)
.Distinct()
.OrderBy(b => b.id);
或者,您也可以使用匿名类型作为快速破解,以获得两个值之间的相等比较器,但仍使用MoreLINQ:
var values = foo.SelectMany(f => f.bars)
.DistinctBy(b => b.id)
.OrderBy(b => b.id);
几乎可以肯定的是,在条中实现平等会更好:)