我无法从列表中获取第一项。数据已从文本文件添加到列表中,但是系统将返回System.Linq.Enumerable+<TakeIterator>d__25'1[System.String]
而不是列表中的第一项。
以下是我的实现
string[] inputData = rawInputData.Split(',');
List<string> splitData = new List<string>(inputData.Length);
splitData.AddRange(inputData);
var numberOfCaves = splitData.Take(1);
Console.Write(numberOfCaves);
我不确定为什么会发生这种情况,任何建议将不胜感激,谢谢!
答案 0 :(得分:5)
只需使用FirstOrDefault
。
由于Split
已经返回一个数组(IEnumerable
),因此您还可以节省很多工作量。因此,您不必创建新列表并将其添加
问题本质上是,Take
返回一个IEnumerable
(针对所有意图和目的的列表,尚未遍历),Console.WriteLine
不知道如何转换将其隐式地存储到string
中,因此它会写出其类型名称
var result = rawInputData.Split(',').FirstOrDefault();
if(result == null) // checks if there are no elements and results null
Console.WriteLine("darn");
else
Console.WriteLine(result);
其他资源
Enumerable.FirstOrDefault Method
返回序列的第一个元素,如果没有则返回默认值 找到元素。
返回一个字符串数组,该数组包含此实例中的子字符串 由指定的字符串或Unicode元素分隔的 字符数组。
Enumerable.Take(IEnumerable, Int32) Method
从a的开头返回指定数量的连续元素 顺序。
- 返回
IEnumerable<TSource>
一个IEnumerable,它从输入序列开始就包含指定数量的元素。
此类中的方法提供了用于查询实现以下内容的数据源的标准查询运算符的实现 IEnumerable。标准查询运算符是通用的 遵循LINQ模式并允许您表达的方法 对任何数据进行遍历,过滤和投影操作 基于.NET的编程语言。
此类中的大多数方法都定义为扩展IEnumerable的扩展方法。这意味着它们可以像 实现IEnumerable的任何对象上的实例方法。
在返回值序列的查询中使用的方法在枚举查询对象之前不会消耗目标数据。 这称为延迟执行。查询中使用的方法 返回单例值的执行并消耗目标数据 立即。
更新
请注意,此处的结果永远不能为null。 –AntonínLejsek
确实是正确的
string.Split
将返回至少1个元素
答案 1 :(得分:3)
使用First
或FirstOrDefault
代替。这些eagerly获得第一项。 Take
使用deferred execution,因此您实际打印的是迭代器的ToString()
,而不是第一项的值。
当您遇到LINQ这类问题时,最好的线索是您应该假定返回IEnumerable<T>
的任何事物都是递延的(尽管并非总是如此),并且返回单个项目的事物都是渴望的(例如{{1 }},Max
,First
,Last
等。
答案 2 :(得分:2)
除了First或FirstOrDefault之外,您还可以直接访问数组条目。
string[] inputData = rawInputData.Split(',');
string first = inputData[0];
string second = inputData[1];
...
但是您必须确保您访问的数组索引确实存在。否则,您将获得访问不存在的条目的异常。