使用Where子句将csv值读入Dictionary

时间:2016-04-15 17:25:34

标签: c# linq

我有一个结构一致的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);
}

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

//...
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的第一行以标题开头,则可以在调用Skip(1)方法后致电ReadAllLines

更新

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

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将抛出异常。