C# 使用linq展平数据
如何使用linq展平以下数据 这里我想按Column1和Column2分组,Column3是字典的键和值 追随-C# 使用linq展平数据,c#,linq,C#,Linq,如何使用linq展平以下数据 这里我想按Column1和Column2分组,Column3是字典的键和值 追随- Pete, small, 2.0, medium, 3.5 Sbux, small, 2.5, medium, 3.0 Mcd, large, 3.0, refill, 5.0 Dd, refill, 4.0, solo, 2.0 Cb, xlarge, 4.0, premium, 4.0 Sb, premium, 4.0, xlarge,refill,extra, 7.0 假设C
Pete, small, 2.0, medium, 3.5
Sbux, small, 2.5, medium, 3.0
Mcd, large, 3.0, refill, 5.0
Dd, refill, 4.0, solo, 2.0
Cb, xlarge, 4.0, premium, 4.0
Sb, premium, 4.0, xlarge,refill,extra, 7.0
假设
Column2
值在Column1
组中不重复,解决方案如下:
var flat = data
.GroupBy(item => item.Column1)
.Select(g => new {
Column1 = g.Key
, Dict = g.ToDictionary(r => r.Column2, r => r.Column3)
}).ToList();
这管用!如何在平面列表中搜索项目列表?例如,如果我查找xlarge,则重新填充它应返回Sb@user793468
“Sb”
s两项中的任何一项都没有钥匙“xlarge,refill”
。如果您想查找带有“xlarge,refill,extra”键的所有项目,可以使用var keys=flat.Where(f=>f.Dict.ContainsKey(“xlarge,refill,extra”)。选择(f=>f.Column1.ToList()代码>我应该如何转换原始数据,以便能够查找密钥中的部分项?@user793468这取决于您希望匹配的灵活性。如果对子字符串匹配没有问题,请将f.Dict.ContainsKey(“xlarge,refill,extra”)
替换为f.Dict.Keys.Any(k=>.Contains(“xlarge,refill”)
。这不是散列查找,因此需要线性时间。它也不会找到“xlarge,extra”
块。要做到这一点,您需要重新构造数据以避免使用多元素键。
var flat = data
.GroupBy(item => item.Column1)
.Select(g => new {
Column1 = g.Key
, Dict = g.ToDictionary(r => r.Column2, r => r.Column3)
}).ToList();