2

想象四个列表,都至少有这个 Id 字符串属性,但可能还有其他属性:

public class A //or B, C, D
{
    public string Id { get; set; }
    //..other properties
}

//so:  
List<A> a1 = new List<A>();
List<B> a2 = new List<B>();
List<C> a3 = new List<C>();
List<D> a4 = new List<D>();

我想在 a1 中选择所有 DISTINCT id,结合 a2、a3 和 a4

我认为 LINQ 语法会是理想的,但是如何将这些与单个字符串属性结合到 IEnumerable 结果中,例如具有 A 类定义的东西。

4

5 回答 5

9

由于它们是不同的类型,我将首先选择Id 属性来获取 IEnumerable<string>,然后连接结果:

var query = a1.Select(a=> a.Id)
              .Concat(a2.Select(b=> b.Id))
              .Concat(a3.Select(c=> c.Id))
              .Concat(a4.Select(d=> d.Id))
              .Distinct();
于 2009-06-09T05:53:52.163 回答
4

这也有效:

new[] {a1, a2, a3, a4}.SelectMany(x => x.Select(y => y.Id)).Distinct();
于 2009-06-09T05:36:23.010 回答
4

联盟

当然,你可以简化这个:

var uniqueIds = (from a in a1
                 select a.Id).Concat(
                 from b in a2
                 select b.Id).Concat(
                 from c in a3
                 select c.Id).Concat(
                 from d in a4
                 select d.Id).Distinct();

通过使用 Union(它执行一个隐式的 'Distinct'),变成:

var uniqueIds =  (from a in a1
                 select a.Id).Union(
                 from b in a2
                 select b.Id).Union(
                 from c in a3
                 select c.Id).Union(
                 from d in a4
                 select d.Id);
于 2009-06-13T14:39:46.057 回答
3

它们真的都是同一类型的列表吗?或者你有

List<A> a1 = new List<A>();
List<B> a2 = new List<B>();
List<C> a3 = new List<C>();
List<D> a4 = new List<D>();

并且您想将它们结合起来,因为所有 4 种类型都有一个共同的字符串 Id 属性?

好的,您的编辑表明我在正确的轨道上。您需要一个定义字符串 Id 属性的接口,并且每种类型 A、B、C 和 D 都需要实现该接口。

然后每个列表都是 Interface 类型,并且 concat 答案将起作用。

如果您没有定义接口的能力,那么您可以使用 LINQ 仅查询每个列表的 Id 字段(您应该得到IQueryable<String>结果),然后连接这些结果。

编辑:这是一个 LINQ 查询,应该可以为您提供所需的内容:

var uniqueIds = (from a in a1
                 select a.Id).Concat(
                 from b in a2
                 select b.Id).Concat(
                 from c in a3
                 select c.Id).Concat(
                 from d in a4
                 select d.Id).Distinct();
于 2009-06-09T05:35:26.617 回答
2

您可以连接相同类型的IEnumerables,然后选择您需要的项目。

var query = a1
    .Concat(a2)
    .Concat(a3)
    .Concat(a4)
    .Select(a => a.ID)
    .Distinct();

编辑:基于新问题...在单个查询中无法从不同的列表类型中进行选择。最好的方法是拥有一个包含您选择的属性的通用类型,然后使用基本类型运行上述查询。

于 2009-06-09T05:31:33.890 回答