[英]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.