2013-11-15 1 views
-1

У меня есть ниже список строкКак искать за строки из списка строк

List A = {"1","2","3"} 

List B = { 
"1,2,3,4,5,6,7", 
"1,2,6,7", 
"1", 
"4,5,6", 
"6,7" 
} 

Я хочу, чтобы все элементы списка B, которые полностью или частично матчей с List A

То есть я хочу вывести

Result = { 
"1,2,3,4,5,6,7", 
"1,2,6,7", 
"1" 
} 

Как это сделать с Linq?

+0

«Частично соответствует» означает, что именно? – Arran

+0

вы видите, что «1,2,6,7» является частью нашего выпуска, хотя наш ввод - это только «1», «2», «3»). То есть нас не беспокоят 6 и 7 в нашем «1,2,6,7» .. –

ответ

5

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

var matches = B.Where(s => s.Split(',').Intersect(A).Any()).ToList(); 

На английском языке:

Найти эти строки в B, что (после того, как раскол), по крайней мере, один элемент общего с A, и сделать список результатов.

See it in action.

Обратите внимание, что если общее количество элементов в A и B составлено, этот метод не будет очень эффективным. Вы можете улучшить ситуацию с помощью предварительной обработки A в HashSet<string> и переписывании фильтра, как

var set = new HashSet<string>(A); 
var matches = B.Where(s => s.Split(',').Any(n => set.Contains(n))).ToList(); 

Эту версии produces the same results и будете намного быстрее для больших входов.

-1

Вы можете использовать Содержит метод,

вар Результат = новый список();

A.ForEach (a => {Result.AddRange (B.Where (b => b.Contains (a)));});

+0

Это не удастся, если вы начнете получать двойные цифры. – Rawling

1

Что вы хотите что-то вроде этого

  string[] A = { "1", "2", "3" }; 

      string[] B = { "1,2,3,4,5,6,7", "1,2,6,7", "1", "4,5,6", "6,7"}; 

      var Result = from string S in B 
         where A.Any(i => S.Contains(i)) 
         select S; 
Смежные вопросы