[英]Using Lambda expression from a separate class in SELECT clause of LINQ query c# Projection
[英]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"
后缀来提取组密钥; 该Value
与IsKey
标志一起添加到列表中, IsKey
标志指示某项是键还是值 "Data0"
, "Data7"
等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.