2013-07-30 3 views
2

Мне нужно сравнить со списком со строками и найти похожие элементы. то есть.Сравнение строк в 2 списках с использованием Linq

List<string> listA = {"ProfileHeight", "ProfileWidth", "WebThickness"} 
List<string> listB ={"ProfileHeightVisibility", "ProfileWidthVisibility", "WebThicknessVisibility", "FlangeThicknessVisibility", "DepthVisibility"} 

Мне было интересно, можно ли использовать Linq. Я хочу, чтобы результат был списком с элементами из ListB, которые имеют имя, похожее на строки в списке. Где statemant т.е. "ProfileHeightVisibility.Contains (" ProfileHeight ") = True

+0

И по " аналогичный "вы имеете в виду' StartsWith' или 'Contains'? – Corak

ответ

13

Вы имеете в виду вы хотите элементы в LISTB where содержит any элементов в lišta

listB.Where(b => listA.Any(a => b.Contains(a)) 
5

Вы можете сделать это в LINQ:

listB.Where(e => listA.Any(a => e.Contains(a))); 

Имейте в виду, что этот алгоритм имеет стоимость выполнения аналогичную O (N^2), он будет таким образом замедлить быстро, как число элементов в списках растет.

0

Да, вы можете сделать такую ​​вещь, с помощью LINQ

public List<string> GetSimilarStrings(List<string> list1, List<string> list2) 
    { 
     return (from item in list1 from item2 in list2 where string.Equals(item,item2,StringComparison.InvariantCultureIgnoreCase) select item).ToList(); 
    } 
+0

Почему вы используете 'string.Compare'? Этот метод возвращает целое число, указывающее лексический порядок двух строк, а не логический, не так ли? –

+0

Да, хороший момент. Я исправил свой ответ. Сравнение строк с помощью «==» может вызвать проблемы с культурой, кодировкой или чувствительностью к словам. В этом примере показано, как обрабатывать эти вещи. – toszo

+0

Я не уверен, что строки должны быть равны *. Тем не менее, я бы скорее использовал 'string.Equals (a, b, StringComparision.InvariantCultureIgnoreCase)' http://msdn.microsoft.com/en-us/library/t4411bks.aspx –

1

Вы также можете реализовать такие вещи, как, что:

public class EqualityComparer : IEqualityComparer<string> 
    { 

    public bool Equals(string x, string y) 
    { 
     return y.Contains(x); 
    } 

    public int GetHashCode(string obj) 
    { 
     return 1; 
    } 
    } 

, а затем использовать пересекаются так:

listB.Intersect(listA, new EqualityComparer()).ToList(); 
Смежные вопросы