2017-03-20 10 views
2

辞書があり、キーの条件に基づいて辞書からすべての値リストを取得したい、つまり、 alist内でそれぞれのキーが一致する値だけを取得します。 例:辞書は今私の要件はkeysStringリストからキーが一致辞書から値の一覧を取得することですCのリストでキーが一致する辞書から値リストを取得する方法#

IDictionary<string, string> maskingValues = new Dictionary<string, string>(); 
     maskingValues.Add("cat", "[email protected]"); 
     maskingValues.Add("dog", "N&avya"); 
     maskingValues.Add("llama", "vivek!a"); 
     maskingValues.Add("iguana", "sh^ams"); 

を次のようにして、私は

List<string> keysString=new List<string>(); 
keysString.Add("cat"); 
keysString.Add("fox"); 

として文字列のリストを持っています。

出力は私がやっていること今まで

[email protected] 

でなければなりません

var all_parameters = maskingValues .Keys.ToList();

var parameters_to_mask = all_parameters.Intersect(keysString); 

var values_list = parameters_to_mask.Where(k => data_dictionary.ContainsKey(k)).Select(k => data_dictionary[k]); 

はとてもvalues_list WILで出力[email protected]

が含まれている、私が取得したすべてのキーを辞書から取り出し、次にcomp keysStringリストのキーリストを作成し、2つのリストの交差の出力から値リストを再調整します。しかし、私はより最適な方法でそれを行うことができますので、コードとパフォーマンスが良いです。

ありがとうございました。私を助けてください。

+1

あなたはそれをしましたか?あなたがやったことは十分だったかもしれません。 – BugFinder

答えて

1

解決策はたくさんあります。これは例えば1:あなたの辞書が大きい

var newlist = maskingValues.Where(x => keysString.Contains(x.Key)).Select(y=>y.Value).ToList(); 
+0

これはまた、私のためにうまくいった。ありがとうございました – Meena

4

これは動作するはずです:

var q = maskingValues.Where(x => keysString.Contains(x.Key)).Select(x => x.Value); 
foreach (var item in q) 
{ 
    Console.WriteLine(item); 
} 
+0

'Select'を使うことができるので、' item.Value'は必要ありません。 –

+0

なぜkeysString.Contains(x.Key)だけではないのですか? –

+0

@AlexandruPupsa - 'keysString'はリストです。 – Sadique

-1
This Should Work: 
Below Solution is used when you know your Key name and want to retrive value of key 


string objectValue; 
    maskingValues.TryGetValue("cat", out objectValue); 

If you want to Retrive All values from Dictionary than used single line of code: 
maskingValues.Values 
+0

これは、OP質問には答えません。これはちょうど一般的な辞書からキーで値を取得しています.... –

1

私はこの完全に使用してLINQを行うには、コードの迅速なビットを思い付きました。

keysString.Where(x => maskingValues.Keys.Contains(x)).ToList().ForEach(x => Console.WriteLine(maskingValues[x])); 
0

場合、あなたは辞書でキーによって要素にアクセスしているという事実を利用することで、パフォーマンスを向上させることができますはO(

var result = keysString 
    .Select(k => 
      { string value; 
      maskingValues.TryGetValue(k, out value); 
      return value; 
      }) 
    .Where(v => v != null); 

です...等... TryGetValueを使用すると、その後の辞書インデクサをContainsを呼び出すよりも効率的であることを

注意。

1

わかりません私は仕様を得ましたが、これはlinqよりも速いです:

var matches = new List<string>(); 
foreach (var key in keysString) 
{ 
    if (maskingValues.TryGetValue(key, out string value)) 
    { 
     matches.Add(value); 
    } 
} 
関連する問題