2017-08-31 91 views
1

我有一個動態的形式,我不能使用MVC的綁定。當我張貼此的FormCollection到我的控制器,簡化的,我有如下形式收集以下數據:C#LINQ查詢/從FormCollection投影

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」中也有「Data0Value」對匹配,否則它會提領不從coll存在的關鍵。

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); 
} 

這裏是什麼做一行一行地解釋:

  • 首先,無關的項目被過濾掉確保只保留"Data"前綴,後綴爲"Key""Value"
  • 接下來,通過刪除"Key"或來提取組密鑰後綴;所述Value被添加到列表中,與表示如果一個項目是
  • 每個組進行檢查,以精確地包含一個鍵或一個值
  • 的項目是由組密鑰分組("Data0""Data7"等)IsKey標誌一起一個關鍵和一個價值;丟棄不完整的組
  • 最後,將組轉換爲鍵值對的字典。