2015-10-27 56 views
1

我有兩個不同長度的字典列表。兩個字典中的鍵都是相同的,值可能不一樣。僅通過特定鍵的值相交字典的兩個列表C#

var A = List<Dictionary<string, object>>(); 
var B = List<Dictionary<string, object>>(); 

我想交叉的A和B基於它們包含的字典對象中的3個鍵的值。

對於例如:

var dict = new Dictionary<string,object>{{"W",val1},{"X",val2},{"Y",val3},{"Z",val4}} 

字典類似於上述被包含在列表中A和B有用於VAL1,VAL2,VAL3,VAL4變化值。如果鍵W,X,Y的值相等,我想交叉A和B,但我不關心Z中交點的值。有沒有辦法實現這個優雅?

用一個例子闡述:

A.add(new Dictionary<string,object>{{"W",123},{"X",456},{"Y",789},{"Z",103}}); 
    A.add(new Dictionary<string,object>{{"W",124},{"X",456},{"Y",789},{"Z",893}}); 
    A.add(new Dictionary<string,object>{{"W",123},{"X",456},{"Y",789},{"Z",134}}); 

    B.add(new Dictionary<string,object>{{"W",123},{"X",456},{"Y",789},{"Z",900}}); 
    B.add(new Dictionary<string,object>{{"W",124},{"X",456},{"Y",789},{"Z",893}}); 
    B.add(new Dictionary<string,object>{{"W",212},{"X",321},{"Y",789},{"Z",134}}); 

如果我做A.intersect(B),我想獲得以下列表後面,

{"W",123},{"X",456},{"Y",789},{"Z",103} 
{"W",123},{"X",456},{"Y",789},{"Z",900} 
{"W",124},{"X",456},{"Y",789},{"Z",893} 
+0

我不知道我理解的問題。你能舉一個例子說明在這種情況下會有什麼樣的結果嗎? – MikeTheLiar

+1

等什麼?你有兩本詞典清單? –

+0

交叉點是什麼意思? –

回答

2

這會給你一個IEnumerable:

var c=A.Select(a=>new {W=a[W],X=a[X],Y=a[Y]}) 
    .Intersect(B.Select(a=>new {W=a[W],X=a[X],Y=a[Y]})); 

或者,自己創建一個自定義的IEqualityComparer,然後你可以這樣做:

var c=A.Intersect(B,new MyComparer()); 

類似:

class MyComparer : IEqualityComparer<Dictionary<string,object>> 
{ 
    public bool Equals(Dictionary<string,object> b1, Dictionary<string,object> b2) 
    { 
     if (b2 == null && b1 == null) 
      return true; 
     else if (b1 == null || b2 == null) 
      return false; 
     else if(b1["W"]==b2["W"] && b1["X"]==b2["X"] && b1["X"]==b2["X"]) 
      return true; 
     else 
      return false; 
    } 

    public int GetHashCode(Dictionary<string,object> bx) 
    { 
     int hCode = bx["W"]^bx["X"]^bx["Y"]; 
     return hCode.GetHashCode(); 
    } 
} 
+0

從bx [「W」]等獲取散列碼可能需要稍微修改,因爲它是一個對象。 W,X,Y應該在第一個例子中引用,如果它們確實是字符串而不是佔位符屬性名稱。 –

+0

工作正常,只是一個快速跟進。如果我想要相同的行爲,但像使用除了設置的減法,這將工作嗎? – Trancey

+1

是的。但是如果你同時做這兩件事,我真的建議使用IEqualityComparer,或者創建一個繼承自Dictionary 的自定義類型,這樣你就可以直接實現所需的接口。那麼你甚至不需要提供IEqualityComparer,只需讓默認值工作即可。 –

相關問題