2017-04-16 5 views
1

以下に定義されているCustomTypeのオブジェクトのリストがあります。すなわちList<CustomType>辞書の照合タイプに基づくオブジェクトリストとC#コレクションを使用する別のリスト

public class CustomType 
{ 
    public int Id {get;set;} 
    public string Value {get;set;} 
    public bool IsCorrect {get; set;} 
} 

今私はCustomTypeIdをフィールドに一致するいくつかのキーが含まれているDictionary<int, String>を持っています。
辞書と同じ値を含む別のList<string>があります。
今私は辞書List<CustomType>ためList<string>値が一致してエントリをIsCorrect =真を更新したいと辞書にキー対応はCustomType同上にマッチします。私は、最初の場所で
を次のことを試してみました

、私のような

var commonKeys = list 
    .Where(k => dictionaty.ContainsValue(k)) 
    .Select(k => dictionary) 
    .Select(m => m.Keys); 

以下のリストと辞書の交差を取得しようとしました今、共通のキーは、値の一致に基づいて、共通鍵が含まれています辞書は、今、私はと commonKeys 同上CustomType一致キーの一致に基づいて、一覧を更新する必要があります。 HashSet<string>で - ギラッドの答えの

Dictionary<int,string> ids; 
List<string> values 
List<CustomType> customTypes; 

foreach(var customType in customTypes.Where(item => ids.ContainsKey(item.Id) && 
                values.Contains(ids[item.Id]))) 
{ 
    customType.IsCorrect = true; 
} 
+0

これは、データベースまたはメモリで実行されます - HashSet.Contains方法では、検索が早くDictionaryのためのキーとなるのでしょうか? –

+1

この操作はメモリ内で実行する必要があります。私は質問を更新します、私が試したこと –

+0

私は他の 'List 'の目的を理解していません。 –

答えて

1

あなたはこのようにそれを達成することができます。 O(1)

var stringSet = new HashSet<string>(stringValues); 
var filtered = customTypes.Where(item => dictionary.ContainsKey(item.Id)) 
          .Where(item => stringSet.Contains(dictionary[item.Id])); 

foreach (var item in filtered) 
{ 
    item.IsCorrect = true; 
} 
+1

@AshishShukla - 私の答えを受け入れてくれてありがとう。現在の 'O(1)'の代わりに 'O(1)'に検索されるので 'List 'の 'HashSet'を作成することをお勧めします。しかし、私はFabioが彼の投稿を更新するようにしたいと私はそれをオーバーライドしたくなかった:) –

1

最適化されたアプローチ:IsCorrectを設定するためにそれらを反復その後、希望のアイテムを取得すると:

関連する問題