2016-08-31 4 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

辞書のキーは一意である必要があります。 件数がをキーとして使用しているので、両方が同じ回数表示される2つの単語がある場合は、例外が発生します。

単語を、あなたが既に知っていることを知っているキーとして使用する必要があります。

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

あなたの辞書のKeyValueを混合します。 Countキーとして使用しようとしています。

したがって、2つの異なる単語が同じ回数発生すると、2つの単語に対して同じキーが使用されます。 1が一度に発生するため、あなたの最後の例は、作品だけで

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

に行を変更し、2が2回発生し、3が3回発生するので、どのキーの衝突はありません。あなたの最初の例もそのために働くはずですが、私はあなたの質問に正しいテスト値を表示していないと思います。

+0

意味があります。ありがとうございました。 – CSharper

関連する問題