2017-03-09 201 views
2

我有一個List<List<Data>>與一些List<Data>這是填充foreach循環。因此,在我創建新的List<Data>之前,我需要檢查List<List<Data>>中的任何List<Data>中是否已經存在某些值。如果是這樣,我需要返回這個列表,添加在此List<Data>.在嵌套列表中搜索

private List<List<DataToShow>> listList; 
private List<DataToShow> list; 

private void sortTestData() 
{ 
    listList = new List<List<DataToShow>>(); 

    foreach (DataToShow data in dataPack) 
    { 
     List<DataToShow> list = new List<DataToShow> { data }; 

      if (listList.Count != 0) 
       checkModusStatus(data); 

      listList.Add(list); 
     } 
    } 

    private void checkModusStatus(DataToShow data) 
    { 
     for (int i = 0; i < listList.Count; i++) 
     { 
      var value = listList[i].Where(x => (x.Mode == data.Mode) && (x.State == data.State)); 
     }   

}

數據所以我總是空的,雖然有相同的條目

2個foreach循環身邊的任何想法?

+1

您是否只需要匹配條件的第一項? – 2017-03-09 10:17:40

+0

是的,第一場比賽。只能有一個「第一」比賽 - 如果有一個比賽,第一次搜索失敗:) –

回答

2

檢查是否在列表中的列表中的任何列表匹配謂語

是的,你可以檢查你的名單列表中的任何列表中是否已經包含了DataToShow你正在考慮加入這樣的等效實例:

bool equivalentInstancePresent = listList.Any(dataList => dataList.Any(data => IsEquivalentInstance(data)); 

private bool IsEquivalentInstance(DataToShow data) 
{ 
    // your check here 
} 

使用Any(predicate)將會遍歷各自的IEnumerable並返回true只要找到與謂詞相匹配的元素。否則在迭代完成後它將返回false

一個較短的版本相同的LINQ表達的:

bool equivalentInstancePresent = listList.Any(dataList => dataList.Any(IsEquivalentInstance); 

獲取匹配謂詞

如果您還需要返回一個包含相當於實例列表列表的第一個列表 - 如說在你的問題 - 你可以用下面的表達式

List<DataToShow> listWithEquivalentInstancePresent = listList.FirstOrDefault(dataList => dataList.Any(IsEquivalentInstance)); 

如評論中所述,您還可以修改謂詞以限制每個列表中的女巫項目以進行檢查。注意:我在下面的例子中爲謂詞使用了一個單獨的變量。

修改謂詞只檢查第x個項目

如果你想你的搜索範圍限制在每​​個列表中的第5個項目:

Func<IEnumerable<DataToShow>, bool> firstFiveItemsContainEquivalentInstance = (dataList) => dataList.Take(5).Any(IsEquivalentInstance); 
var listWhereFirstFiveItemsContainEquivalentInstance = listOfLists.FirstOrDefault(firstFiveItemsContainEquivalentInstance); 

修改謂詞只檢查x個每個列表中的項目

只檢查第一項是相對簡單的,如下所示。

Func<IEnumerable<DataToShow>, bool> firstItemIsEquivalent = (dataList) => IsEquivalentInstance(dataList.FirstOrDefault()); 
var listWhereFirstItemIsEquivalentInstance = listOfLists.FirstOrDefault(firstItemIsEquivalent); 

謂詞每個列表看起來只選中第二個項目如下

Func<IEnumerable<DataToShow>, bool> secondItemIsEquivalent = (dataList) => IsEquivalentInstance(dataList.Skip(1).Take(1).SingleOrDefault()); 
+0

是否只能在列表的第一項中搜索?每個指數中有數千個項目會影響績效。 –

+1

@ a.w。我在這方面更新了我的答案。 –

0

爲了您DataToShow,你需要重寫Equals方法

public override bool Equals(object obj) 
{ 
    if (obj == null) return false; 
    DataToShow x = obj as DataToShow; 
    if (x == null) return false; 
    else return (x.Mode == this.Mode) && (x.State == this.State); 
} 

現在你可以使用爲收集定義的Contains方法

foreach (List<Data> innerlist in listlist) { 
    if(innerlist.Contains(data)) 
     return innerlist; 
    return Null; 
} 

爲datapack中的每個數據調用此函數。