从列表中获取第一个项目

6

我在获取列表的第一个项目上遇到了困难。数据是从文本文件中添加到列表中的,但系统返回的是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);

我不确定为什么会发生这种情况,非常感谢您提供任何建议!谢谢!

3个回答

9

只需使用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 方法

返回序列的第一个元素,如果未找到元素,则返回默认值。

String.Split 方法

返回一个字符串数组,其中包含在此实例中由指定的字符串或Unicode字符数组的元素分隔的子字符串。

Enumerable.Take(IEnumerable, Int32) 方法

从序列开头返回指定数量的连续元素。

  • 返回 IEnumerable<TSource> 包含来自输入序列开头的指定数量的元素的 IEnumerable。

Enumerable 类

  • 该类中的方法为实现实现 IEnumerable 的数据源查询标准查询运算符提供了一个实现。标准查询运算符是通用方法,其遵循 LINQ 模式,并使您能够在任何基于 .NET 的编程语言中对数据进行遍历、筛选和投影操作。

  • 该类中的大多数方法都被定义为扩展方法,扩展 IEnumerable。这意味着它们可以像在任何实现 IEnumerable 的对象上的实例方法一样被调用。

  • 在返回值序列的查询中使用的方法不会消耗目标数据,直到查询对象被枚举。这被称为延迟执行。用于返回单个值的查询中使用的方法会立即执行并消耗目标数据。

更新

顺便说一下,这里的结果永远不可能为空。 – Antonín Lejsek

这确实是正确的

string.Split 将返回至少 1 个元素


顺便提一下,在这里结果永远不可能为 null。 - Antonín Lejsek

4

除了使用First或FirstOrDefault之外,您还可以直接访问数组条目。

string[] inputData = rawInputData.Split(',');
string first = inputData[0];
string second = inputData[1];
...

但是,您必须确保您所访问的数组索引确实存在。否则,您将因访问不存在的条目而得到异常。


4
使用 FirstFirstOrDefault 代替。这些 急切地 获取第一个项目。Take 使用 延迟执行,因此您实际上打印的是迭代器的 ToString(),而不是第一个项目的值。
当您在 LINQ 中遇到此类问题时,最好的提示是假定返回 IEnumerable<T> 的任何内容都是延迟的(虽然并非总是如此),而返回单个项的任何内容都是急切的(例如 MaxFirstLastSingle 等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接