【问题标题】:Retrieve the first item from a list从列表中检索第一项
【发布时间】:2018-11-21 21:26:41
【问题描述】:

我无法从列表中获取第一项。数据从文本文件添加到列表中,但是系统返回 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);

我不确定为什么会发生这种情况,如果有任何建议,我们将不胜感激,谢谢!

【问题讨论】:

    标签: c# arrays list


    【解决方案1】:

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

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

    String.Split Method

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

    Enumerable.Take(IEnumerable, Int32) Method

    返回从一个开始的指定数量的连续元素 顺序。

    • 返回 IEnumerable&lt;TSource&gt; 一个 IEnumerable,它包含从输入序列开始的指定数量的元素。

    Enumerable Class

    • 此类中的方法提供标准查询运算符的实现,用于查询实现 可数的。标准查询运算符是通用的 遵循 LINQ 模式并使您能够表达的方法 对任意数据的遍历、过滤和投影操作 基于 .NET 的编程语言。

    • 此类中的大多数方法都定义为扩展 IEnumerable 的扩展方法。这意味着它们可以被称为 任何实现 IEnumerable 的对象上的实例方法。

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

    更新

    附带说明,这里的结果永远不能为空。 ——安东尼·莱杰克

    这确实是正确的

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

    【讨论】:

    • 附带说明,这里的结果永远不能为空。
    【解决方案2】:

    请改用First 或FirstOrDefault。这些eagerly 获得第一项。 Take 使用deferred execution,所以您实际打印的是迭代器的ToString(),而不是第一项的值。

    当您在使用 LINQ 时遇到此类问题时,最好的线索是您应该假设任何返回 IEnumerable&lt;T&gt; 的内容都会被推迟(但并非总是如此),并且任何返回单个项目的内容都是急切的(例如 Max、@ 987654329@、Last、Single 等)。

    【讨论】:

      【解决方案3】:

      除了 First 或 FirstOrDefault 您还可以直接访问数组条目。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多