2017-03-09 14 views
2

私はList<List<Data>>の1つを持っていて、それにはforeach-loopで埋められたList<Data>があります。したがって、私が新しいList<Data>を作成する前に、List<Data>の値がすでに存在するかどうかを確認する必要があります。List<List<Data>>です。もしそうなら、私は2つのforeach文の横に同じエントリネストされたリスト内で検索する

任意のアイデアがありますが、だから私は常に、nullを取得します。この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)); 
     }   

}

にデータを追加するために、このリストを返す必要があります?

+1

条件に一致する最初のアイテムのみが必要ですか? –

+0

はい、最初の試合です。 「最初の」一致が1つしかない場合は、最初に検索できませんでした:) –

答えて

2

チェックはリストのリストのいずれかのリストが述語と一致するかどうか

はい、あなたはリストのリスト内の任意のリストがすでにDataToShowあなたは、このように追加することを考えているのと同等のインスタンスが含まれているかどうかを確認することができます:

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

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

を使用すると、IEnumerableを反復し、述語に一致する要素が見つかるとすぐにtrueを返します。そうでなければ、反復が完了した後にfalseを返します。

同じLINQ式の短いバージョン:

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

はあなたにも同等のインスタンスを含むリストを返すために必要がある場合は

述語一致するリストのリストの最初のリストを取得します - 述べたようにあなたの質問に - あなたは次の式を使用することができます

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

コメントで尋ねられたように、述語を変更して、各リストの魔法のアイテムをチェックしてチェックすることもできます。注:以下の例では、述部に別の変数を使用します。のみチェックx番目に

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

修正述語:のみ最初のx番目の項目

あなたは、各リストの最初の5つの項目に検索範囲を制限したい場合は

をチェックする

修正述語各リストの項目

最初の項目のみを確認することは、以下のように比較的簡単です。あなたのDataToShowのために

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

リストの最初の項目のみを検索できますか?各インデックスに何千ものアイテムがあるとパフォーマンスに影響します。 –

+1

@ a.w。私はこの点について私の答えを更新しました。 –

0

を次のように各リストにのみ2番目の項目をチェックする

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

述語が見える、あなたは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; 
} 

データパックの各データに対してこの関数を呼び出します。

関連する問題