2016-10-08 16 views
0

のセットのすべての決定:のような(C#辞書が含まれている場合、私は、次の辞書持っている価値

Dictionary<string, ArrayList> vertices = new Dictionary<string, ArrayList>(); 
vertices.Add("Key1",stringarray1); 
vertices.Add("Key2",stringarray2); 
vertices.Add("Key3",stringarray3); 

は、今、私が把握しようとしているが、辞書の他のキーごとにチェックする方法です"Key2"か(ArrayList)の値のうちの1つまたはすべてが含まれていても機能していない場合は、)。これは非常に単純ですが、私はそれを得ることができませんでした。

var values = (ArrayList)vertices["Key1"]; 
foreach (var val in vertices) 
{ 
    if (val.Key != "Key1" && val.Value.Contains(values)) 
    { 
     //do something here 
    } 
} 
+0

それはあなたの問題ですが、デフォルトでは文字列の比較で大文字と小文字が区別されるかどうかわかりません。 'val.Key!=" Key1 "&&' – RyBolt

+0

を使用します。arrayListに格納するデータは何ですか?この構造を使用している特定の理由は何ですか? –

答えて

1

問題は、あなたがContainsに間違ったことを渡しているということです。 Containsはコレクション内で検索するアイテムを受け取る予定ですが、コレクション全体を渡しています。あなたはアイテムが、コンパイル時エラーを受け取っていないが、それだけでは動作しません(とアイテムがobject年代は、参照をチェックすることである比較使用して比較されobjectとして格納されている。

あなたはArrayListを、使用しているためこのようにそれを行うためのLINQを使用することができます。

string key = "Key1"; 
var key1Collection = vertices[key].Cast<object>().ToList(); 
foreach(var item in vertices.Where(x => x.Key != key)) 
{ 
    //If you want that all the items of the collection will be in the "Key1" collection: 
    if(item.Value.Cast<object>().All(x => key1Collection.Contains(x)) 
    { 
     //Do stuff 
    } 

    //Or if you want that at least 1 of the items of the collection will be in the "Key1" collection: 
    if(item.Value.Cast<object>().Any(x => key1Collection.Contains(x)) 
    { 
     //Do stuff 
    } 
} 

あなたのデータ構造がArrayListからList<TheTypeOfYourItems>に変更した場合、あなたはすべての.Cast<object>を必要としません

+0

私はいくつかの手動操作を行う必要があるので、どの正確なKeyがtrueを返しているかを知る必要があります。あなたは助けてもらえますか? – Srini

+0

@Srini - アップデートを参照 –

+0

@Srini - あなたは 'ArrayList'を使用している理由は何ですか?あなたがそこに置いている実際のデータは何ですか? –

1

コレクションは包含メソッドにではなく単なる要素に渡すことはできません。したがって、key1配列の要素を繰り返し処理し、もう一方の配列にも含まれているかどうかを確認する必要があります。

var key1Val = vertices["key1"]; 
foreach (var val in vertices) 
     { 
      if(val.Key != "key1") 
      { 
       bool exist = false; 
       foreach (var element in val.Value) { 
         if(key1Val.Contains(element)){ 
          exist = true; 
          break; 
         } 
       } 
        if(exist){  /*do stuff*/} 
       //do something here 
      } 
     } 
+0

これは動作しますが非常に無差別なアプローチ – Srini

+1

あなたが役に立つとマークした答えは私の答えとまったく同じ時間の複雑さを持っていますので、どのように効率が良くなると思うか混乱します。私はそれがより簡潔な構文(あなたが書いたものを組み込もうとしました)を使用することを認めますが、それはあなたがそれを実行するのに何とか速いと思うことに騙されません。 –

+1

最悪の場合、key1以外のリストのすべての要素とkey1リストのすべての要素を常に比較する必要があります。唯一の最適化は、あなたがマッチしたときにチェックを中断することです(これは私がやったことです)。 Linq記法を使用してもこの事実は変わりません。 –

1
var key1Values; 
if (!vertices.TryGetValue("Key1", out key1Values)) { 
    return; 
} 

foreach(KeyValuePair<string, ArrayList> entry in vertices) 
{ 
    if((entry.Key == "Key2" || entry.Key == "Key3") && entry.Value.Any(item => key1Values.Contains(item)) 
    { 
     //do some work 
    } 
} 
1

どのようにこの件について:

var keys = 
    vertices 
     .Where(y => y.Key != "Key1") 
     .Where(y => vertices["Key1"].Cast<string>().Intersect(y.Value.Cast<string>()).Any()) 
     .Select(x => x.Key); 

それとも、あなたはList<string>ArrayListを変更した場合:

var keys = 
    vertices 
     .Where(y => y.Key != "Key1") 
     .Where(y => vertices["Key1"].Intersect(y.Value).Any()) 
     .Select(x => x.Key); 
+0

私は間違っているが、辞書のすべてのリストを他のリストと比較していないのですか? OPは、最初のリストを他のすべてのリストと比較することを求めていました。例えば、リスト2とリスト3の交差点が不要なので、この交差点を探す必要はありません。 –

+0

また、1 - 2交差点が2-1交差点と同じであるため、重複一致が発生します。 –

+0

@ LucasKot-Zaniewski - あなたは正しいですか?私は答えを修正しました。 – Enigmativity

関連する問題