如何在LINQ语句中显式键入这些变量?

时间:2016-04-12 22:49:17

标签: c# linq csv

我正在以this answer中描述的方式解析csv文件;它很棒。

    public static List<string> MatchedLines(string[] MyArray)
    {
        List<string> csvFile = FileReadLinestoList(@"C:\Temp\MyFile.csv");
        //This doesn't work! //var lines = new IEnumerable<string>{from line in csvFile where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] select line};
        var lines = from line in csvFile where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] select line;
        return lines.ToList();
    }

但是,我不喜欢使用&#39; var&#39;除非变量类型是明确的,在这种情况下它们不是。如何在明确声明&#39;行&#39;的类型的同时编写此声明?和&#39; line&#39;?

3 个答案:

答案 0 :(得分:3)

您无法直接创建界面实例,因此new IEnumerable<string>根本无法正常工作。但您仍然可以通过指定类似的类型将变量键入为接口:

IEnumerable<string> lines = from line in csvFile where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] select line;

作为旁注,在当前的LINQ表达式中,最终将字符串拆分两次。您可以使用let子句来提高效率:

IEnumerable<string> lines = 
    from line in csvFile 
    let parts = line.Split(new[] { ',' }, 3)
    where parts[0] == MyArray[0] && parts[1] == MyArray[1] 
    select line;

答案 1 :(得分:2)

在代码中使用var没有错,如果您正在处理LINQ查询,尤其是。如果您决定更改LINQ,则每次都可能需要对类型声明进行大量更改。使用var,您可以轻松避免麻烦。在许多情况下,您不需要知道中间类型是什么。

答案 2 :(得分:1)

您选择的是您输入的行,因此您从List<string>开始,最后得到IEnumerable<string>

你可以这样改变

var lines = from line in csvFile where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] select line;

IEnumerable<string> lines = from line in csvFile where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] select line;

但是你可以简化整个过程,因为你在这个方法中唯一要做的就是创建csvFile变量并将其作为列表返回,你可以将整个方法更改为:

public static List<string> MatchedLines(string[] MyArray)
{
    return (from line in FileReadLinestoList(@"C:\Temp\MyFile.csv")
            where line.Split(',')[0] == MyArray[0] && line.Split(',')[1] == MyArray[1] 
            select line).ToList();
}