У меня есть строка со списком писем, разделенных запятыми

var emails="a@gmail.com,b@gmail.com,c@gmail.com,d@gmail.com,e@gmail.com,";
var list=new List<string>();
list.Add("c@gmail.com");
list.Add("d@gmail.com");

Как я могу написать запрос linq, чтобы узнать, имеет ли строка (электронная почта) какой-либо адрес электронной почты, соответствующий коллекции (списку).

Я использую EF, а строка электронных писем является свойством в классе, а список - независимой коллекцией.

-2
Pawan Agrawal 6 Янв 2016 в 19:28

4 ответа

Лучший ответ

В этом решении используется linq. Поскольку ваши адреса электронной почты разделены запятыми (и заканчиваются запятой), мы можем проверить, содержится ли Any () элементов в списке в строке электронных писем. Я использовал ToLower (), чтобы сделать его нечувствительным к регистру (как правило, адреса электронной почты).

var hasMatch = list.Any(item => ","+emails.ToLower().Contains(","+item.ToLower()+","));
3
FonnParr 6 Янв 2016 в 16:39
var emailsList = emails.Split(',');
list.Any( x => emailsList.Contains(x));

Другой подход

  HashSet<String> emailSet = New HashSet<String>(temp.Split(","));
  list.Any(s => emailSet.Contains(s, StringComparer.Ordinal));

Используйте HashSet - Contains работает быстрее (если строка писем может быть большой) и удаляет дубликаты И сравнение stringg с учетом регистра без создания новых строк с помощью ToLower()

0
Fabio 6 Янв 2016 в 17:00
emails.Split(',').Any(e=>list.Contains(e));

Альтернативно:

emails.Split(',').Intersect(list).Any();

Если вы используете его для поиска записей в базе данных, вы можете сделать это:

db.MyTable.Where(l=>list.Any(e=>l.emails.StartsWith(e+",")) ||
list.Any(e=>l.emails.EndsWith(","+e)) ||
list.Any(e=>l.emails.Contains(","+e+",")) ||
list.Any(e=>l.emails==e)
)

Или вы можете упростить это с помощью:

db.MyTable.Where(l=>list.Any(e=>(","+l.emails+",").Contains(","+e+",")))

Третий вариант может работать лучше, если вы ищете первую запись, поскольку он может использовать любой индекс, который у вас есть в электронной почте, чтобы быстро найти запись, но он сгенерирует несколько действительно больших операторов SQL, если список большой (текущие реализации SQL LINQ к сожалению, поставщик переводит это в функцию CHARINDEX вместо LIKE 'email%', но это может измениться).

Четвертый вариант генерирует более простой SQL и, вероятно, будет работать лучше, если вы хотите найти все совпадающие записи, а не только первую.

1
Robert McKee 6 Янв 2016 в 17:07

Вы можете сделать это следующим образом

emails.Split(',').Any (y => list.Contains (y));
0
Valentin 6 Янв 2016 в 16:44