Поиск списка строк в C # - PullRequest
       1

Поиск списка строк в C #

1 голос
/ 17 октября 2011

Итак, я хочу использовать одну из этих функций LINQ с этим List<string> У меня есть.

Вот настройки:

List<string> all = FillList();
string temp = "something";
string found;
int index;

Я хочу найти string в all, который соответствует temp, когда оба имеют нижний регистр с ToLower(). Затем я использую найденную строку, чтобы найти ее индекс и удалить ее из списка.

Как я могу сделать это с помощью LINQ?

Ответы [ 5 ]

4 голосов
/ 17 октября 2011

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

var listEntry = all.Where(entry => 
          string.Equals(entry, temp, StringComparison.CurrentCultureIgnoreCase))
         .FirstOrDefault();

if (listEntry != null) all.Remove(listEntry);
0 голосов
/ 15 января 2014

ОК, я вижу мое императивное решение не вызывает никакой любви, поэтому вот решение LINQ, которое, вероятно, менее эффективно, но все же избегает поиска по списку два раза (что является проблемой в принят ответ):

var all = new List<string>(new [] { "aaa", "BBB", "Something", "ccc" });
const string temp = "something";

var found = all
    .Select((element, index) => new {element, index})
    .FirstOrDefault(pair => StringComparer.InvariantCultureIgnoreCase.Equals(temp, pair.element));

if (found != null)
    all.RemoveAt(found.index);

Вы также можете сделать это (что, вероятно, более производительно, чем выше, поскольку оно не создает новый объект для каждого элемента):

var index = all
    .TakeWhile(element => !StringComparer.InvariantCultureIgnoreCase.Equals(temp, element))
    .Count();

if (index < all.Count)
    all.RemoveAt(index);
0 голосов
/ 17 октября 2011

Используйте инструмент, который лучше всего подходит для работы.В этом случае простой фрагмент процедурного кода кажется более подходящим, чем LINQ:

var all = new List<string>(new [] { "aaa", "BBB", "Something", "ccc" });
const string temp = "something";
var cmp = StringComparer.InvariantCultureIgnoreCase; // Or another comparer of you choosing.

for (int index = 0; index < all.Count; ++index) {
    string found = all[index];
    if (cmp.Equals(temp, found)) { 
        all.RemoveAt(index);
        // Do whatever is it you want to do with 'found'.
        break;
    }
}

Это, вероятно, так быстро, как вы можете получить, потому что:

  • Сравнение это сделано на месте- не создается временных строк в верхнем или нижнем регистре только для сравнения.
  • Элемент ищется только один раз (O (index)).
  • Элемент удаляется без созданияновый список (O (all.Count-index)).
  • Делегаты не используются.
  • Straight for имеет тенденцию быть быстрее, чем foreach.

Его также можно довольно легко адаптировать, если вы хотите обрабатывать дубликаты.

0 голосов
/ 17 октября 2011

Я хочу добавить к предыдущим ответам ... почему бы вам просто не сделать это так:

string temp = "something";
List<string> all = FillList().Where(x => x.ToLower() != temp.ToLower());

Тогда у вас есть список без этих элементов на первом месте.

0 голосов
/ 17 октября 2011
all.Remove(all.FirstOrDefault(
            s => s.Equals(temp,StringComparison.InvariantCultureIgnoreCase)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...