2011-11-24 56 views
2

這裏是我的問題:LINQ - 比較列出的詞典裏找到新的和已更改的對象

我有兩個詞典具有相同的結構:

Dictionary<string, List<Object>> Existing 
Dictionary<string, List<Object>> New 

基本上我需要做的是先找到任何List<Object>基於密鑰在New中但不在現有中,然後在New中包含的每個List<Object>中找到任何對象,該對象在Existing中相應的List<Object>中不存在,或者根據Object中的多個屬性進行更改,當然,字典鍵。

我目前正在循環和檢查每個對象,但我認爲必須有更好的方式來使用LINQ來做到這一點。

希望這是明確的,但讓我知道如果你需要更多的信息。

謝謝。

+0

請向我們展示您的代碼。 – Magnus

回答

3

至於在字典中的新條目和新的對象內的條目的List<object>

List<object>[] addedLists = New.Keys.Except(Existing.Keys) 
            .Select(key => New[key]) 
            .ToArray(); 

object[] addedObjects = Existing.Keys.Intersect(New.Keys) 
            .SelectMany(key => New[key].Except(Existing[key]) 
            .ToArray(); 

但最後一個要求是有點不清楚。你將如何定義一個改變的對象?應該比較哪些對象進行更改?將任何對象與任何其他對象進行比較可能會被定義爲不同的,因此必須有一些相似之處來進行比較(例如,在其屬性ID中具有相同值的對象)。

編輯:正如您在您的評論的對象的身份是如何定義的明確,這裏是如何找到的所有更改的對象(假設該詞典的價值是具有特性的Foo列表NameType標識的對象和屬性Value可能會改變:

var differences = Existing.Keys.Intersect(New.Keys).SelectMany(key => 
    from existingObj in Existing[key] 
    join newObj in New[key] on new { existingObj.Name, existingObj.Type } equals 
           new { newObj.Name, newObj.Type } 
    where existingObj.Value != newObj.Value 
    select new { Key = key, Existing = existingObj, New = newObj }); 

這將產生各自含有字典中的差被發現,現有的物體和新物體的密鑰對象的序列相同的對象將不被包括在結果中。

+0

是的,會有基於對象的屬性,即名稱,類型等的相似性,我基本上會比較,看看是否一個特定的屬性已經改變。所以'name == name && type == type && changedprop!= changedprop' – indignatz

+0

@indignatz:明白了,看看我上面的編輯。 –

+0

謝謝你。看起來我對linq有很多瞭解。 :) – indignatz

0
Dictionary<string, int> New = new Dictionary<string, int>(); 
Dictionary<string, int> Existing = new Dictionary<string, int>(); 

New.Add("A", 100); 
New.Add("B", 200); 
New.Add("Y", 300); 
New.Add("X", 400); 


Existing.Add("A", 1); 
Existing.Add("B", 2); 
Existing.Add("C", 3); 
Existing.Add("D", 4); 
Existing.Add("E", 5); 
Existing.Add("F", 6); 
Existing.Add("G", 7); 
Existing.Add("H", 8); 

var newStuff = New.Where(n => !Existing.ContainsKey(n.Key)).ToList(); 
var updatedStuff = Existing.Where(e => New.ContainsKey(e.Key) && e.Value != New.Single(n => n.Key == e.Key).Value); 


newStuff.Dump(); 
updatedStuff.Dump(); 

//updated and new 
newStuff.AddRange(updatedStuff); 
newStuff.Dump(); 

在Linqpad完成。