2017-01-30 5 views
1
私はDataGridViewの中に、以下のデータを持っている

からリストの辞書を取得します。DataGridViewの

enter image description here

私の目的は、辞書<FeatureName, List<PropertyName>>を取得することです。

{ Speed, {protocol} } 

{Fan, {Protocol, lowPWM} } 

{Grade, {Protocol, limits} } 

これまでのところ、私は以下のコードでcheckedrowsを得た:

var checkedRows = this.configDiffDataGridView.Rows.Cast<DataGridViewRow>() .Where(row => (bool?)row.Cells[4].Value == true) .ToList();

そして、取得しようとし始めてしまったので、絵のために、それはキーと値のペアを持つ3つのエントリいるはず示します

var groupsByFeature = checkedRows.GroupBy(r => r.Cells["Feature Name"].Value);

しかしfiguすることはできません:以下のコードで確認された行のうち辞書それを動作させる方法を再考してください。助けてください。あなたがもっと良いアプローチをしていると思うなら、私はそれを聞いています。ありがとう!

答えて

2

Lookup<string, string>するDictionary<string, string[]>に似ていると思います:いくつかを回避

ILookup<string, string> lookup = configDiffDataGridView.Rows.Cast<DataGridViewRow>() 
    .Where(r => true.Equals(r.Cells[4].Value)) 
    .ToLookup(r => r.Cells[0].Value as string, r => r.Cells[1].Value as string); 

Debug.Print(string.Join(",", lookup["Fan"])); // "Protocol,lowPWM" 

辞書のバージョンLINQのオーバーヘッドとキャスティング(テストされていない):

var dgv = this.configDiffDataGridView;    
var dict = new Dictionary<string, List<string>>(); 

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    if (true.Equals(dgv[4, i].Value))   // to avoid Exception when Value is not bool 
    { 
     string key = dgv[0, i].Value as string; // or Value?.ToString() for non-string types 
     List<string> list; 

     if (!dict.TryGetValue(key, out list)) // if not found, create and add 
     { 
      list = new List<string>(2);   // adjust capacity to the average # of items 
      dict.Add(key, list); 
     } 
     list.Add(dgv[1, i].Value as string); 
    } 
} 
+0

これは私が必要としていた難しい部分を解決しました。ルックアップを辞書に変換し、私が探していたものを正確に得るための答えを編集しました。ありがとう@Slai –

+0

@JcAlmonte項目を追加する必要がない場合は、グループ値[既に配列に格納されている](https://referencesource.microsoft.com/#)を辞書に変換する必要はありませんSystem.Core/System/Linq/Enumerable.cs、eba6ce0eb1bb3acc)。また、 'lookup ["存在しない値]は、Exceptionの代わりに空の結果を返します。辞書が本当に必要な場合は、より良い答えを与えることができますが、変換は 'var dict = lookup.ToDictionary(x => x.Key、x => x.ToList())' – Slai

+0

です。探していた私は本当に辞書が必要ではない、私は親しみのために1つを使用することを好みました。学習のために、私は厳密に辞書が必要であるかのように "より良い"答えを追加しますか?本当にありがとう。 –

0

私は何ウルが探して(あなたがして、グループから新しいオブジェクトを作成する必要があります)

checkedRows.Cast<DataGridViewRow>().GroupBy(item => item.Cells[Feature Name].Value) 
.Select(group => new { FeatureName = group.Key, Properties = group.Cells["Property Name].Value.ToList() }) 
.ToList() 
+0

私はこれを試しましたが、 'group'に' Cells'の定義が含まれていないので、 'group.Cells [" Property Name "]'の 'Select'節でエラーが発生します。 –

+0

'cells' – Hadi

+0

私もそれを試みましたが、' item'は 'group'のために定義されていません。 'item.Cells'を実行しようとしましたが、select句で' item'にアクセスできません –