2017-08-31 7 views
1

MVCのバインディングを使用できない動的フォームがあります。私は私のコントローラにこのFormCollectionを投稿すると、簡略化され、私は、フォームのコレクション内の次のデータがあります。FormCollectionからのC#LINQクエリ/投影

public ActionResult Foo(FormCollection coll) 
... 
    coll["Data0Key"] contains "category" 
    coll["Data0Value"] contains "123" 
    coll["Data1Key"] contains "location" 
    coll["Data1Value"] contains "21" 
    coll["Data7Key"] contains "area" 
    coll["Data7Value"] contains "test" 
    coll["SomethingElse"] contains "irrelevent" 

を..私は、これらの未知の数を持っており、別々のキーからキーと値のペアを作成したいですコレクション内の値オブジェクト

私は次の行を試しています。私の辞書に与え

var settings = coll.AllKeys 
     .Where(k => k.StartsWith("Data")) 
     .ToDictionary(k => k, k => coll[k]); 

:私は本当に持っていると思い何

Data0Key, category 
Data0Value, 123 
Data1Key, location 
Data1Value, 21 
Data7Key, area 
Data7Value, test 

は次のように構造化キーと値のペアのコレクションです。

category, 123 
location, 21 
area, test 

達成可能なことは何か、あるいは別のアプローチを見つける必要がありますか?

+2

辞書はどのようにキー値のペアのコレクションと異なるのですか? – Maritim

+0

私の用語を許して、私は辞書でうまくいきます、それは達成するのに苦労している構造です。 – CaRDiaK

+0

私はちょうどあなたの質問をもう一度読んで、私はあなたが今何を意味するかを参照してください:) – Maritim

答えて

3

「DataxKey」の部分だけを反復して値を検索したいと思うと思います。ような何か:

.Where(k => k.StartsWith("Data") && k.EndsWith("Key")) 
.ToDictionary(k => coll[k], k => coll[k.Replace("Key", "Value")]); 

これは、すべての「Data0Key」はまた、それ以外の場合はcollから存在しないキーを逆参照になるだろう、「Data0Value」に一致するペアを持っていることを前提としています。

1

これは比較的簡単なLINQクエリを行うことができます:ここでは

var data = new Dictionary<string,object> { 
    ["Data0Key"] = "category" 
, ["Data0Value"] = "123" 
, ["Data1Key"] = "location" 
, ["Data1Value"] = "21" 
, ["Data7Key"] = "area" 
, ["Data7Value"] = "test" 
, ["SomethingElse"] = "irrelevent"     
}; 
var kvp = data 
    .Where(p => p.Key.StartsWith("Data") && (p.Key.EndsWith("Key") || p.Key.EndsWith("Value"))) 
    .Select(p => new { 
     Key = p.Key.Substring(0, p.Key.Length - (p.Key.EndsWith("Key") ? 3 : 5)) 
    , IsKey = p.Key.EndsWith("Key") 
    , p.Value 
    }) 
    .GroupBy(p => p.Key) 
    .Where(g => g.Count(p => p.IsKey) == 1 && g.Count(p => !p.IsKey) == 1) 
    .ToDictionary(g => (string)g.Single(p => p.IsKey).Value, g => g.Single(p => !p.IsKey).Value); 
foreach (var p in kvp) { 
    Console.WriteLine("{0} - {1}", p.Key, p.Value); 
} 

が行われているもののライン・バイ・ラインの説明は次のとおりです。

  • まず、無関係な項目がによって除外されています接頭辞は、接尾辞は"Key"または"Value"
  • であることを確認してから、"Key"またはを削除してグループ鍵を抽出します接尾辞; Valueアイテムが各グループが正確に含有するためにチェックされる
  • キーまたは
  • アイテムがグループ鍵によってグループ化された値("Data0""Data7"、等)であった場合IsKeyフラグが示すとともに、リストに追加され1つのキーと1つの値。不完全なグループは破棄されます。
  • 最後に、グループはキーと値のペアの辞書に変換されます。