2016-08-31 63 views
1

我有一個List<string>其中一些值正在重複。我想獲得特定的string,它是發生次數。我嘗試過幾種情況,在某種情況下它不起作用,並且想知道爲什麼?從C#中的列表<string>獲取發生的編號和字符串

代碼:

var list = new List<string>() { "Yahoo" , "MSN", "Yahoo", "MSN", "Yahoo", "MSN", "MSN" }; 

//Works: 
var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(word => word).Select(g => new {Count = g.Count(), g.Key}); 

//Doesn't work: 
var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(x => x).ToDictionary(x => x.Count(), x => x.Key); 

錯誤:

An item with the same key has already been added.

然而,隨着工作正常。

var list = new List<int>() {1, 2, 2, 3, 3, 3}; 
var test = list.GroupBy(x => x).ToDictionary(x => x.Count(), x => x.Key); 

我不知道我在這裏錯過了什麼。

回答

2

它們在字典中的鍵必須是唯一的。你使用計數作爲關鍵,所以如果你有兩個單詞都出現相同的次數,那麼你會得到一個異常。

您應該使用作爲您已知道的唯一關鍵字。

linesFromTextFile.GroupBy(x => x) 
    .ToDictionary(x => x.Key, x => x.Count()); 
3

你混合Key和你的字典Value。您正在嘗試使用Count作爲密鑰

因此,如果兩個不同的單詞出現相同的次數,那麼對於兩個單詞您具有相同的密鑰。只要改變行

var lineWithNumberOfOccurance = linesFromTextFile.GroupBy(x => x) 
       .ToDictionary(x => x.Key, x => x.Count()); 

你的最後一個例子工程,因爲1發生一次,2發生兩次,3發生三次,所以沒有鍵衝突。你的第一個例子也應該工作,但我想你只是沒有在你的問題中顯示正確的測試值。

+0

有意義。謝謝。 – CSharper

相關問題