Получить первый элемент из списка - PullRequest
0 голосов
/ 22 ноября 2018

У меня проблемы с получением первого элемента из списка.Данные добавляются в список из текстового файла, однако система возвращает 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);

IЯ не уверен, почему это происходит, и любые предложения будут оценены, спасибо!

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Используйте взамен First или FirstOrDefault.Эти охотно получают первый предмет.Take использует отложенное выполнение , поэтому на самом деле вы печатаете ToString() итератора, а не значение первого элемента.

Лучшая подсказка, когда вы сталкиваетесь с этимиз проблем с LINQ является то, что вы должны предполагать, что все, что возвращает IEnumerable<T>, откладывается (хотя и не всегда верно), и что все, что возвращает один элемент, стремится (например, Max, First, Last, Single,и так далее).

0 голосов
/ 22 ноября 2018

Помимо First или FirstOrDefault, вы также можете напрямую обращаться к записям массива.

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

Но вы должны убедиться, что индекс массива, к которому вы обращаетесь, действительно существует.В противном случае вы получите исключение для доступа к несуществующей записи.

0 голосов
/ 22 ноября 2018

Просто используйте 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, который содержит указанное количество элементов из tначало последовательности ввода.

Перечислимый класс

  • Методы в этом классе обеспечивают реализациюстандартных операторов запросов для запросов к источникам данных, которые реализуют IEnumerable.Стандартные операторы запросов - это методы общего назначения, которые следуют шаблону LINQ и позволяют выражать операции обхода, фильтрации и проецирования данных на любом языке программирования на основе .NET.

  • Большинствоиз методов в этом классе определены как методы расширения, которые расширяют IEnumerable.Это означает, что они могут быть вызваны как метод экземпляра для любого объекта, который реализует IEnumerable.

  • Методы, которые используются в запросе, возвращающем последовательность значений, не используют целевые данные до тех пор, покаОбъект запроса перечислен.Это известно как отложенное выполнение.Методы, используемые в запросе, который возвращает одноэлементное значение, выполняются и немедленно используют целевые данные.

Обновление

Как примечание, результат никогда не может быть нулевым здесь.- Антонин Лейсек

Что действительно верно

string.Split Вернет хотя бы 1 элемент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...