jinesh sam Ответов: 3

Как искать список массивов с помощью в диапазоне


Привет друзья,

Мне нужно найти массив, который содержит 600 элементов.Мое требование состоит в том, что мне нужно искать массив, скажем, от индекса 200 до 400. Как я могу этого достичь?

Что я уже пробовал:

var lines = File.ReadAllLines(csvpath).Select(x => x.Split(',')).ToList();
        
var portdetails = lines.Where(acc => acc[0].Trim() == "PORTDTLS").ToList();


		    
                    

3 Ответов

Рейтинг:
22

Karthik_Mahalingam

попробовать это

var itemsFrom200to400 = lines.Skip(200).Take(200).ToList();
var portdetails = itemsFrom200to400.Where(acc => acc[0].Trim() == "PORTDTLS").ToList();


Philippe Mori

Хорошее решение но первое ToList() звонок лишний. Бесполезное выделение памяти и пустая трата времени.

Рейтинг:
11

#realJSOP

Я не думаю, что это приведет к тому, что вы на самом деле ищете.

Попробовать это:

var portdetails = lines.Where(acc => lines.IndexOf(acc) >= 200 && lines.IndexOf(acc) <= 400 && acc.Trim().StartsWith("PORTDTLS ").ToList();


После того как вы получите строки, затем разделите их на разделитель-запятую.

Другой вопрос - всегда ли диапазон индексов будет 200-400? Откуда ты это знаешь? Как вы можете это гарантировать? Я думаю, вам нужно сделать шаг назад и снова взглянуть на проблему.


jinesh sam

Спасибо Джон:) Для поиска индекса у меня есть отдельный метод

Philippe Mori

Я думаю, что это решение было бы неэффективным, как это могло бы быть... например, O(n2) вместо O (n), поскольку я не верю, что Linq to object оптимизирует такое использование IndexOf Кроме того, если в списке есть дубликат, вы можете не получить ожидаемого результата, так как он, вероятно, будет принимать индекс первого вхождения строки вместо фактического. Таким образом, в Примере OP, если одна и та же строка существует с индексами 100 и 300, вы, вероятно, не получите ни того, ни другого...

#realJSOP

Я просто дал ему ответ, который он искал. Меня не волнует "эффективность", потому что это не мой код. Вызов ToList () даже не нужен, Но это то, что он делал, так что это то, что я сделал. Что касается использования linq, то linq , как известно, работает медленнее, особенно если вы начинаете укладывать последующие вызовы linq друг на друга. Итак, вы можете видеть, что я прекрасно осведомлен о "эффективности", но предпочел игнорировать их.

Технически мой ответ уместен и не гарантирует вашего 2-го голоса. Кстати, я не заметил от вас ответа на этот вопрос - просто критика ответов, которые уже были здесь.

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

Philippe Mori

Ну, я не предоставил решение 3 + Мой комментарий был бы моим ответом...

Хотя не всегда нужно беспокоиться об эффективности, я верю в то, что написание кода достаточно эффективно. Таким образом, в подобном случае я действительно считаю, что использование Skip и Take как это решение 3 стоит 2 дополнительных голосов.

Рейтинг:
1

Richard MacCutchan

Скопируйте необходимые элементы в другой список (см. Список(Т).Метод CopyTo (Int32 И Т[], Типа Int32, Int32) Для (Системы.Коллекции.Общий)[^]).