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);
几乎可以肯定的是,在
条中实现平等会更好:)