2013-04-22 5 views
5

私はキーがIDで、値が、私は今、一人一人が、私がしたいC#には辞書のContainsAny()メソッドがありますか?

IEnumerable<int> 

あるCarIdsプロパティを持つ人物オブジェクトのリストを持っている文字列

ある辞書を持っています基本的に、オブジェクトのリストをフィルタリングして、プロパティの1つが辞書に含まれる項目のみを含めるようにします。

たとえば、このような何か:

var dictionary = GetDict(); 

var people = GetPeople(); 

people = people.Where(r => dictionary.ContainsAny(r.CarIds)).ToList(); 

、このようなものは、私はにContainsKey(に似た何かを行うことができますどこに存在する)が、intのリスト内の任意のかどうかを確認していますか?

+0

知識をひけらかす:C#はさえContainsAnyのような辞書、はるかに少ないのメソッドを持っていません。 .NETには辞書があり、そのような方法があるかもしれません。 –

答えて

5

はい、あなたはリストのためにこれを試すことができます:辞書用

people = people.Where(r => list.Intersect(r.CarIds).Count() != 0).ToList(); 

を、あなたは、この使用することができます。

people = people.Where(r => r.CarIds.Any(n => dictionary.ContainsKey(n))).ToList(); 
+0

ありがとうございます。私はlist.Keys.Interectが辞書を与えられているように見えるので、ちょっと微調整してください。 – leora

+0

@leoraアップデートを試してください。それは 'Intersect'より速く動作するはずです。 – dasblinkenlight

+0

私はあなたの更新された答えに従わないが、それはboolを返すようだが、あなたは!= 0チェックをしている。 。 – leora

6

をあなたの最善の策は、辞書(おそらく持つべきを拡張するために、おそらくですContainsAny()またはContainsAnyKey())。

public static bool ContainsAny<K, V>(
     this Dictionary<K, V> dict, IEnumerable<K> keys) 
{ 
    foreach(K key in keys) 
     if(dict.ContainsKey(key)) return true; 
    return false; 
} 

、これはとlinq'dすることができます。

public static bool ContainsAny<K, V>(
      this Dictionary<K, V> dict, IEnumerable<K> keys) 
    { return keys.Any(key => dict.ContainsKey(key)); } 
関連する問題