鉴于从以下方面返回的数据:
public IEnumerable<IEnumerable<string>> ReadFile(string filename)
{
List<List<string>> items;
// Read entire file content into items.
...
return items;
}
如何检索/返回特定列?
public IEnumerable<string> GetColumnAtIndex(IEnumerable<IEnumerable<string>> items, int index)
{
// THIS IS NOT WORKING...
return (from row in items
select row.ElementAt(index)).ToList();
}
预期用途示例:
var items = ReadFile(@"testdata.csv");
var singleColumn = GetColumnAtIndex(items, 2);
答案 0 :(得分:0)
刚刚阅读了您的评论,即您的问题是您获得了ArgumentOutOfRangeException
,那么最可能的原因是构成您的行的某些List<string>
对象没有足够的元素在你要求的专栏中有一些东西。
例如,一个空行可能会解析为空List<string>
或者在位置0只有一个""
的行。如果您要尝试获取位置5处的所有条目,那么它会到达这一行会引发异常。
如果您有List<List<string>> items
,并希望List<string>
位于第0位,则可以执行此操作:
List<string> innerList = items[0];
如果您想要该列表中第0个位置的项目,您可以执行
string item = items[0][0];
除非我错过了你想要做的事情,否则你不需要使用linq。
哦,我已经意识到你可能想要每个外部列表的内部列表中的第n个项目......在这种情况下,你应该有什么工作,而且确实在我的测试用例中:
List<List<string>> foo = new List<List<string>>(){new List<string>(){"1","2","3","4","5"},new List<string>(){"6","7","8","9","0"}};
var output = (from row in foo
select row.ElementAt(2)).ToList();
output.Dump();