лямбда-выражения для сравнения, содержит ли строка [] заданную строку

1

Мой проект работал отлично, пока мне не пришлось учитывать массив строк, а не один... Я не знаю, как это исправить. Country является свойством текущего класса, в котором этот метод находится. Он был единственной строкой, но теперь это массив.

Первоначально это выглядело так:

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower().Contains(Country.ToLower());
}

Я не могу понять, как настроить его так, чтобы, если ЛЮБОЙ из строк в Country соответствовал payment.Country Country... и, конечно же, это возвращает выражение... Это мое лучшее предположение (но, очевидно, не правильно), как делать то, что мне нужно сделать:

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower() == Country.Any().ToLower();
}
Теги:
linq
arrays
expression

2 ответа

6
Лучший ответ

Вы хотите проверить все содержимое Country против payment.Country Country, например:

return payment => Country.Any(
    c => payment.Country.ToLower().Contains(c.ToLower()));

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

return payment => Country.Any(
    c => payment.Country.IndexOf(c, StringComparison.OrdinalIgnoreCase) >= 0);
  • 0
    Работает как шарм !!!! Спасибо!
  • 0
    Вы должны изменить свой ответ, ToLower что первый вариант связан с ненужным созданием строк из-за обращений к ToLower . Второй вариант лучше, если он хороший, а первый - плохой.
Показать ещё 1 комментарий
2

.Any принимает лямбда в, который может выполнить ваше сравнение. Вышеприведенный код предполагает, что он возвращает некоторый объект, который приравнивается к true при сравнении, но Any возвращает простой bool. Таким образом, попробуйте

return payment =>
    Country.Any(c =>
        string..Equals(payment.Country, c, StringComparison.InvariantCultureIgnoreCase));

Также обратите внимание, что .Equals часто предпочтительнее для оператора "==", особенно со строками, если вы можете передать параметр StringComparison.

  • 0
    Мне тоже нравится этот ответ ... хорошо показывает сравнение строк !!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню