簡體   English   中英

LINQ選擇與4個IEnumerable列表不同

[英]LINQ selecting distinct from 4 IEnumerable lists

想象一下四個列表,至少都有這個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>();

我想選擇所有DISTINCT ID:a1,結合a2,a3和a4

我認為LINQ語法是理想的,但是如何將它們與具有單個字符串屬性的IEnumerable結果相結合,例如具有類A定義的東西。

由於它們是不同的類型,我首先選擇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();

這也有效:

new[] {a1, a2, a3, a4}.SelectMany(x => x.Select(y => y.Id)).Distinct();

聯盟

當然,你可以簡化這個:

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);

它們真的是所有相同類型的列表嗎? 或者你有

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都需要實現該接口。

然后每個列表將是接口類型,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();

您可以連接相同類型的IEnumerables,然后選擇您需要的項目。

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

編輯:基於新問題...在單個查詢中無法從不同的列表類型中進行選擇。 最好的方法是使用包含您正在選擇的屬性的公共類型,然后使用基類型運行上述查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM