2013-07-30 99 views
2

我需要比較列表中的字符串,並找出相似的元素。即。使用Linq比較2個列表中的字符串

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

我想知道是否可以使用Linq。我希望結果成爲ListB中與ListA中的字符串名稱相似的元素的列表。凡衆所周知聲明,即「ProfileHeightVisibility.Contains(」 ProfileHeight「)=真

+0

並以「類似「你的意思是'StartsWith'或'Contains'? – Corak

回答

13

你的意思是你想在數組listB where項目它包含了listA的元素any

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();