繁体   English   中英

FormCollection中的C#LINQ查询/投影

[英]C# LINQ Query / Projection from FormCollection

我有一个动态形式,不能使用MVC的绑定。 简化后,当我将此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

我想实现的目标是否完全可能,还是我需要找到其他方法?

我认为您只想遍历“ DataxKey”部分,然后查找值。 就像是:

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

假设每个“ Data0Key”也都有一个“ Data0Value”匹配对,否则它将从coll取消引用一个不存在的键。

这可以通过相对简单的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"后缀来提取组密钥; ValueIsKey标志一起添加到列表中, IsKey标志指示某项是键还是值
  • 项由组密钥(分组"Data0""Data7"等)
  • 每个组都被检查为恰好包含一个键和一个值。 不完整的组将被丢弃
  • 最后,将组转换为键值对字典。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM