簡體   English   中英

我在一個列表中有多個列表對象,如何獲取每個子列表中存在的項目?

[英]I have multiple list objects in one list, how can i get the items that exist in every child list?

從基本的 class 開始:

public class Car
{
  public string Name {get;set;}
}

然后我可以創建這些汽車的列表

List<Car> cars = new List<Car>();

新的步驟是擁有此列表的列表,如下所示:

List<List<Car>> allListsOfCars = new List<List<Car>>();

填充 allListsOfCars 后,我想將它傳遞給 function,它將返回每個列表列表中存在的汽車。

我知道這聽起來很混亂,所以我會嘗試多解釋一下。

如果我有 ListA、ListB、ListC 所有類型的 List - 現在將它們組合成 1 個保存列表(列表的列表),那么我怎樣才能取回每個列表中存在的所有汽車? 例如,如果汽車只存在於 ListA 中,那么我不感興趣,它需要存在於 ListA AND ListB AND ListC 中,然后我希望將它添加到結果集中並返回。

提前致謝。

您需要找到所有子列表的復合交集。

IEnumerable<Car> result=allListsOfCars.FirstOrDefault();
if(result!=null)
{
    foreach(var sublist in allListsOfCars.Skip(1))
    {
        result=result.Intersect(sublist);
    }
    //enumerate result to run the query
}

可能可以使用Aggregate運算符重寫以消除循環,但Aggregate永遠不會很好地讀取 IMO。

如果列表很長,您可能會使用HashSet獲得不錯的速度提升

IEnumerable<Car> fst=allListsOfCars.FirstOrDefault();
if(result!=null)
{
    HashSet<Car> hs=new HashSet<Car>(fst);
    foreach(var sublist in allListsOfCars.Skip(1))
    {
        hs.IntersectWith(sublist); //in-place operation
    }
    //enumerate hs
}

確保您的Car class 正確實現了相等成員和GetHashCode ,否則這些方法都不會按預期工作。

如果您有權訪問 .NET 3.5 或更高版本,您可以執行以下操作:

IEnumerable<Car> carList = allListsOfCar.SelectMany(cars => cars);

編輯:

要執行列表的交集,您可以執行以下操作:

List<Car> carList = allListsOfCar.Aggregate((left, right) => left.Intersect(right).ToList());

您可以使用 Aggregate,我認為這是一個非常真實的用例:

var allCars = allListOfCars.Aggregate((listAcc,list2)=> listAcc.Concat(list2).ToList());

基本上,對於每個元素(在本例中為 List<> )將其連接到累加器,最后得到一個列表。

我嘗試了與亞當相同的方法,但將其擴展了一點。

IEnumerable<Car> carList = listCars.SelectMany(cars => cars);

List<Car> repeatedCars = new List<Car>();

int length = listCars.Count;

foreach (Car c in cars1)
{
    int numberRepeats = carList.Count(car => car.Name == c.Name);
    if (numberRepeats == length)
    {
        repeatedCars.Add(c);
    }
}

基本上,您需要知道您有多少個列表並將它們全部保存在一個列表中。 然后只需遍歷第一個汽車列表(或其中任何一個)並計算列表中具有相同名稱的汽車的數量以及所有其他列表。 如果長度和重復次數相同,則該車在所有列表中。

暫無
暫無

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

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