次のように定義された辞書Dictionary<string, List<int>>
があります。List<Int>
複数の値が含まれるエントリのみが含まれるようにフィルタリングしたいと思います。
以下のコードは私の辞書を正しく構築します(Andrew Whitakerに感謝します)
Dictionary<string, List<int>> fieldNameList =
Mapping.Select(m => m.FieldName)
.Select((c, i) => new { Value = c, Index = i })
.GroupBy(o => o.Value, o => o.Index)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
ただし、複数の項目を含むリストのみが最終的な辞書に含まれるように、フィルターで絞り込む必要があります。
私が間違っていることを理解したいので、追加のフィルターについて説明していただけませんか。
.Where(m => m.Value.Count > 1)
これでうまくいくと思って既存のクエリを追加しましたが、「暗黙の変換」エラーが発生します。
フィルタを適用できる最も早い時期は、グループ化後、辞書を作成する前です。
.GroupBy(o => o.Value, o => o.Index)
.Where(g => g.Count() > 1)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
これには説明は必要ありません。そもそも辞書に不要な項目を追加しないという点で最も効率的です。
単一アイテムのリストを保持したいが、それらを一部の時間だけフィルターで除外したい場合は、代わりに、
dict.Where(p => p.Value.Count > 1)
あなたの最初の試み
.ToDictionary(grp => grp.Key, grp => grp.ToList())
.Where(m => m.Value.Count > 1);
は完全に合理的なことですが、によって生成される結果のタイプはであるため、機能しませWhere
んIEnumerable<KeyValuePair<string, List<int>>>
でした。ただし、この値を具象辞書として型指定された変数に割り当てようとしています。これは、キーと値のペアの列挙可能なリストの特殊なケースであり、型の安全性を保証するために、コンパイラーはそれを停止する必要があります。
のタイプをfieldNameList
上記に変更した場合、この行はコンパイルされますが、IDictionary<K, V>
後でインターフェイスを使用することはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加