C# 使用linq展平数据

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

如何使用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

假设
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();