【问题标题】:Reading csv values into Dictionary with Where clause使用 Where 子句将 csv 值读入字典
【发布时间】:2016-08-07 19:00:16
【问题描述】:

我有一个结构一致的 csv 文件。前两个字段包含位置和类别值。

位置 + 类别条目通常是唯一的。但是,如果它们重复,则第三个字段将包含集合中每一行的不同值。因此 field1 + field2 + field3 将始终形成一个唯一键。

我想返回给定位置 + 类别对的字典对象列表,字典键为字符串,组合字段 1-3,字典值包含整行。

这是我目前所拥有的,但我无法让它工作:

public static List<Dictionary> ItemEntries(string LocationAndCategory)
{
string fileOfLocations = @"C:\MyFile.csv"
return File.ReadAllLines(fileOfLocations).Where(line => line.Split(',')[0] + " " + line.Split(',')[1] == LocationAndCategory).Select(line => line.Split(',')).ToDictionary(data => data[0] + data[1] + data[2], data=> line);
}

【问题讨论】:

  • 但是,这是抛出异常还是您不期望的结果?请问您能更具体一点吗?
  • 我收到构建错误:“使用泛型类型 'System.Collection.Generic.Dictionary' 需要 2 个类型参数”

标签: c# linq


【解决方案1】:

你可以试试这个:

//...
return (from line in File.ReadAllLines(fileOfLocations)
        let columns=line.Split(',')   // apply the Split just one time
        where columns[0]+" "+ columns[1] == LocationAndCategory   //apply your filter
        group line by columns[0]+columns[1]+columns[2] into g   //group the lines using the three columns to create a key
        select new {Key=g.Key, Lines= g.ToList()}).ToDictionary(e=>e.Key, e=>e.Lines);

使用方法语法是这样的:

return File.ReadAllLines(fileOfLocations).Select(l=> new {Line=l, Columns=l.Split(',')})
                                         .Where(e=>e.Columns[0]+" "+e.Columns[1]==LocationAndCategory)
                                         .GroupBy(e=>e.Columns[0]+e.Columns[1]+e.Columns[2], e=>e.Line)
                                         .ToDictionary(g=>g.Key,g=>g.ToList() );

如果 CSV 的第一行以标题开头,您可以在调用 ReadAllLines 方法后调用 Skip(1)

更新

也许这就是你真正想要的:

public static Dictionary<string,string> ItemEntries(string LocationAndCategory)
{
    return File.ReadAllLines(fileOfLocations).Select(l=> new {Line=l, Columns=l.Split(',')})
                                             .Where(e=>e.Columns[0]+" "+e.Columns[1]==LocationAndCategory)
                                             .ToDictionary(e=>e.Columns[0]+e.Columns[1]+e.Columns[2],e=>e.Line);
}

PS:这里假设这三列的组合是唯一的,否则ToDictionary 会抛出异常。

【讨论】:

  • 谢谢,我试试看。你能告诉我关于方法语法与第一个方法语法的优缺点吗?我
  • 无,查询语法只是糖语法。最后,如果您使用查询语法,则稍后会在编译代码时转换为 .NET 公共语言运行时 (CLR) 的方法调用。检查此msdn 页面
  • 嗯,我无法让这些方法中的任何一种工作 - 不同的打字错误。
  • 您能否更具体地说明问题所在?我即时编写了这些查询,我在第一个中修复了一些拼写错误,您发现第二个有什么问题吗?
  • 确定第一个是抛出:无法将类型 'System.Collections.Generic.List>' 隐式转换为 'System.Collections.Generic。 List' (CS0029) 并且无法将类型 'System.Collections.Generic.Dictionary>' 隐式转换为 'System.Collections.Generic.List>' (CS0029)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2015-07-06
相关资源
最近更新 更多