2009-10-26 50 views
1

我有一個Customer []對象的數組,我想用它來創建一個字典< Customer,string >。加載字典之前檢查數組的重複內容的最簡單方法是什麼?我想避免「ArgumentException:具有相同密鑰的項目已被添加」。謝謝。C#檢查對象數組重複

+0

我想知道在前面,如果重複獲得通過與在飛行檢查,因爲我添加項目。我可以使用Dictionary.ContainsKey但後來我通過數組旋轉兩次,我的猜測是不可怕的,我只是想知道如果有一個更簡單的方法,我不知道。謝謝。 – 2009-10-26 20:48:01

回答

6

在添加客戶之前,只需調用Dictionary.ContainsKey(key)即可。

5

你可以使用LINQ做兩件事:

Customer[] customers; // initialized somehow... 
var customerDictionary = customers.Distinct().ToDictionary(cust => cust.SomeKey); 

如果你將建立在一個不太直接的方式的字典,你可以只使用Distinct()擴展方法來獲得的,獨特的,像這樣:

Customer[] uniqueCustomers = customers.Distinct().ToArray(); 

如果您需要了解潛在的重複項,可以先使用GroupBy(c => c)確定哪些項目有重複項。

最後,如果你不想使用LINQ,您可以構建在飛行詞典和使用的前提條件檢查添加的每個項目時:

var customerDictionary = new Dictionary<Customer,string>(); 
foreach(var cust in customers) 
{ 
    if(!customerDictionary.ContainsKey(cust)) 
     customerDictionary.Add(cust, cust.SomeKey); 
} 
+0

我喜歡這種方法的樣子,我不願意談論在這種情況下的性能,但不會調用不同的陣列上涉及做了很多的比較?Dictionary.ContainsKey相對O(1)。 – 2009-10-26 20:54:19

+0

@Josh:我的理解是,LINQ的Distinct()運算符在內部構建了一個哈希集結構來優化其性能。所以它應該比僅僅通過重複搜索列表重複執行更好。閱讀此SO問題更多:http://stackoverflow.com/questions/146358/efficiently-merge-string-arrays-in-net-keeping-distinct-values – LBushkin 2009-10-27 01:07:49

2

多大的陣列?有多大可能會有重複?

檢查數組中的每個元素與其他元素是相當昂貴的操作。

在添加每個項目之前調用Dictionary.ContainsKey(key)會更快。

注意:如果重複是罕見的,那麼你可以使用異常處理,但這是不好的編程習慣。

+0

小陣列。這是我前進的方向,但我希望先知道在開始加工之前是否通過了欺騙。 Dictionary 中的字符串是來自與Customer對象關聯的Web服務的一些響應XML。 – 2009-10-26 20:53:30

+0

使用異常處理進行流量控制不是一種理想的做法。 – LBushkin 2009-10-26 20:53:57

+0

我同意,LBushkin。 – 2009-10-26 20:55:04

0

爲什麼不這樣?

Customers.Distinct.ToDictionary(o=>o, GenerateString(o)); 
1

在這種情況下,您對重複的定義是什麼?

如果它只是簡單的相同的對象實例(相同的指針),那麼很簡單,你可以使用這裏給出的其他答案中的任何方法。

雖然有時平等的概念,也不是那麼簡單的,與相同的數據等於一個不同的對象實例?在這種情況下,您可能需要一個IEqualityComparer的實現來幫助您。

+0

假設兩個Customer對象具有相同的SSN。 – 2009-10-26 20:56:34

+0

啊,在這種情況下,你需要指定Equality,因爲指針的簡單比較不會告訴你。 – 2009-10-26 21:20:17

+0

因此,您可以使用SSD作爲字典中的關鍵字,或者爲了獲得更完整的解決方案,您可以實現可在一堆linq擴展方法中使用的IEqualityComparer 。 – 2009-10-26 21:26:53

2

這樣做,從性能和代碼點的最有效的方式,是這樣的:

dict[key] = value 

這樣你提到的異常將永遠不會拋出,而鍵查找不會發生兩次

+0

+1,因爲他沒有說每個對象的值都是唯一的。 – Will 2009-10-26 21:01:15