我正在以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;?
答案 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();
}