Список — с разделителями-запятыми — Где вернуть определенный элемент

Я не уверен, как подойти к этой проблеме. У меня есть список (без ключа: пара), разделенный запятыми.

С точки зрения непрофессионала, я хочу вернуть 4-й элемент, когда нахожу элемент в списке. Например, если я нахожу элемент Pear, я хочу вернуть значение 0,3.

Пример списка:

"Apple,P03100B0B0,,1,0.8,0,0.9,0"

"Pear,KO3100B0B0,,1,0.3,0,0.2,0"

Я смотрел на использование linkq, но не получил его для работы.

Хотелось бы, чтобы что-то подобное работало.

var res = listString.Select(x => x.Split(',')[4]).Select(a => a.Contains("Pear"));

Будет ли формат всегда одинаковым — ключ, который вы ищете, всегда будет первым элементом? Или строка может быть Some,Value,Pear и все еще совпадать?

dvo 22.05.2019 16:12

@dvo - формат всегда будет одинаковым, а мой первый элемент будет уникальным.

Pirate 22.05.2019 16:29

отличный. см. мой ответ и текст под кодом о .FirstOrDefault();

dvo 22.05.2019 16:31
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
3
78
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Просто разделите свою строку на массив и получите 4 элемента, если формат вашей строки всегда будет одинаковым.

Что-то вроде этого:

string[] result = yourString.Split(',');
if(result[0].ToString() == "Pear")
{
  string finalresult = result[3].ToString();
}

Итак, вы правы, вам нужно сначала .Split свой listString. Поскольку он может содержать пустые элементы, удалите их. Затем проверьте, есть ли в вашем разделенном списке определенный элемент, например «Груша», и выберите 4-й элемент (если в списке есть 4-й элемент)

var str = "Pear,KO3100B0B0,,1,0.3,0,0.2,0";
var res = str.Split(',').Where(x => !string.IsNullOrEmpty(x)).ToArray();

if(res.Contains("Pear") && res.Length > 2){
    Console.WriteLine(res[3].ToString());
}

Примечание. Массивы основаны на 0 при их индексации.

Для удобства чтения я мог бы сделать что-то вроде этого:

foreach(var item in listString)
{
    var segments = item.Split(',');
    if(segments[0] == "Pear") // change how you do this comparison according to your needs
        // do something with segments[4]       
}

... возможно, добавив немного обработки в случае, если строка искажена. Например, чтобы игнорировать строки, которые не могут быть обработаны, вы можете добавить это сразу после разделения строки:

if(segments.Length < 5) continue;

Это будет обрабатывать как пустые строки, так и строки, у которых недостаточно значений для следующего шага, чтобы иметь смысл. continue просто переходит к следующему элементу в цикле foreach.

Возможно, вы могли бы найти способ сделать все это в одной строке, но потребовалось бы больше времени на запись, чтение и столько же времени на выполнение. Представьте, что вы сталкиваетесь с кодом, который вам нужно понять или поддерживать. Что вы предпочитаете: код выше или длинный однострочный запрос LINQ?

Ответ принят как подходящий

Вы можете сделать это в LINQ. Вы можете использовать Select для разделения списка, затем, если список разделения содержит ваш ключ (в данном случае «Груша»), выберите индекс 4 списка разделения. С вашими демонстрационными данными это возвращает список из 1 строки: { "0.3" }. Если результатов нет, список будет возвращен с Count равным 0.

var res = listString
    .Select(x => x.Split(','))
    .Where(x => x.Contains("Pear"))
    .Select(x => x[4])
    .ToList();

Если вам нужен только первый результат или вы ожидаете только один результат, потому что у вас есть контролируемый набор данных, замените .ToList(); на .FirstOrDefault();, чтобы вернуть только строковое значение ("0.3"). Если нет совпадений с вашим ключом поиска, строковое значение будет null.

В случае, если может быть только один элемент с определенным ключом, замените ToList на FirstOrDefault. Результатом будет строка вместо списка строк. Вместо проверки всех столбцов с помощью x.Contains("Pear") вы можете просто проверить первый элемент с помощью x[0] == "Pear".

Olivier Jacot-Descombes 22.05.2019 16:35

@OlivierJacot-Descombes Хороший вопрос. Он прокомментировал, что формат всегда будет одинаковым, чтобы он мог делать x[0] == "Pear" и получать более быстрые результаты! Спасибо за замечание.

dvo 22.05.2019 16:40

Другие вопросы по теме