Найти все совпадения в списке LinQ

49
4

Учитывая ситуацию, я получил строковый массив из файла, содержащего идентификаторы.
Которые могут быть разделены различными символами, "":; и т.п.
Я хотел бы получить каждую строку в одном новом списке/массиве, используя LinQ, который содержал любой из данных разделителей.
В настоящее время я делаю это довольно неудобно

string[] separator = { " ", ",", ";", ".", ":", "/" };
string[] arr = { };
listExceptions = someSource;
List<string> entrysWithSeparator=
(from s in listExceptions where (ContainsAny(s,separator) == true) select s).ToList();
//ContainsAny returns a bool, if any of the separators was found in the string
List<string> tmpExceptions = listExceptions.ToList();

foreach (string s in entrysWithSeparator)
{
arr = s.Split(separator, StringSplitOptions.RemoveEmptyEntries);
tmpExceptions.AddRange(arr.ToList());
}
listExceptions = new string[listExceptions.Count()-1];
listExceptions = tmpExceptions.Distinct().ToArray();

спросил(а) 2015-02-27T14:28:00+03:00 4 года, 11 месяцев назад
2
Решение
69

var result = list.SelectMany(s => 
s.Split(separator, StringSplitOptions.RemoveEmptyEntries))
.Distinct();

Нет необходимости в ContainsAny, так как Split() в строке, содержащей никаких разделителей, также возвращает сама строку.

ответил(а) 2015-02-27T14:48:00+03:00 4 года, 11 месяцев назад
Еще 1 ответ
49

Вы должны иметь возможность комбинировать запрос и цикл с помощью SelectMany:

listExceptions = listExceptions
.Where(s => ContainsAny(s,separator))
.SelectMany(s => s.Split(separator, StringSplitOptions.RemoveEmptyEntries))
.ToArray();

Я предполагаю, что вы используете метод ContainsAny подобный этому в вашем запросе.

ответил(а) 2015-02-27T14:36:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема