我有一個Customer []對象的數組,我想用它來創建一個字典< Customer,string >。加載字典之前檢查數組的重複內容的最簡單方法是什麼?我想避免「ArgumentException:具有相同密鑰的項目已被添加」。謝謝。C#檢查對象數組重複
回答
在添加客戶之前,只需調用Dictionary.ContainsKey(key)即可。
你可以使用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);
}
我喜歡這種方法的樣子,我不願意談論在這種情況下的性能,但不會調用不同的陣列上涉及做了很多的比較?Dictionary.ContainsKey相對O(1)。 – 2009-10-26 20:54:19
@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
多大的陣列?有多大可能會有重複?
檢查數組中的每個元素與其他元素是相當昂貴的操作。
在添加每個項目之前調用Dictionary.ContainsKey(key)
會更快。
注意:如果重複是罕見的,那麼你可以使用異常處理,但這是不好的編程習慣。
小陣列。這是我前進的方向,但我希望先知道在開始加工之前是否通過了欺騙。 Dictionary
使用異常處理進行流量控制不是一種理想的做法。 – LBushkin 2009-10-26 20:53:57
我同意,LBushkin。 – 2009-10-26 20:55:04
爲什麼不這樣?
Customers.Distinct.ToDictionary(o=>o, GenerateString(o));
在這種情況下,您對重複的定義是什麼?
如果它只是簡單的相同的對象實例(相同的指針),那麼很簡單,你可以使用這裏給出的其他答案中的任何方法。
雖然有時平等的概念,也不是那麼簡單的,與相同的數據等於一個不同的對象實例?在這種情況下,您可能需要一個IEqualityComparer的實現來幫助您。
假設兩個Customer對象具有相同的SSN。 – 2009-10-26 20:56:34
啊,在這種情況下,你需要指定Equality,因爲指針的簡單比較不會告訴你。 – 2009-10-26 21:20:17
因此,您可以使用SSD作爲字典中的關鍵字,或者爲了獲得更完整的解決方案,您可以實現可在一堆linq擴展方法中使用的IEqualityComparer
這樣做,從性能和代碼點的最有效的方式,是這樣的:
dict[key] = value
這樣你提到的異常將永遠不會拋出,而鍵查找不會發生兩次
+1,因爲他沒有說每個對象的值都是唯一的。 – Will 2009-10-26 21:01:15
- 1. 檢查重複數組
- 2. 檢查對象數組中的重複項?
- 3. 檢查arraylist中的重複對象id
- 4. 重複檢查對象的NSDictionary
- 5. 檢查NSMutableArray中的重複對象?
- 6. 檢查重複的Javascript對象
- 7. 檢查重複對象與AngularJS
- 8. NG-重複無法檢索對象的數組數據
- 9. 檢查的對象數組複製並計數
- 10. C#檢查重複項
- 11. 檢查數組中的重複值
- 12. 檢查數組中的重複
- 13. Python檢查數組中的重複項
- 14. Java - 二維數組,檢查重複
- 15. 檢查數組是否重複
- 16. 檢查數組是否重複
- 17. 檢查並返回重複數組php
- 18. JavaScript多維數組檢查重複
- 19. 複製/重命名JSON對象數組
- 20. 如何檢查此數組中的重複答案? c#
- 21. 檢查簡單數組中的重複字符[C]
- 22. C++檢查數組的重複項並替換它們
- 23. 檢查數組對象是否存在
- 24. 檢查數組中的對象
- 25. 用鍵數組檢查嵌套對象
- 26. 檢查對象數組的唯一性
- 27. 在對象數組上檢查ID
- 28. 檢查JS對象包含數組
- 29. 檢查一個對象數組
- 30. 檢查的對象數組屬性值
我想知道在前面,如果重複獲得通過與在飛行檢查,因爲我添加項目。我可以使用Dictionary.ContainsKey但後來我通過數組旋轉兩次,我的猜測是不可怕的,我只是想知道如果有一個更簡單的方法,我不知道。謝謝。 – 2009-10-26 20:48:01