2017-04-11 147 views
1

的字符串我有兩個列表C#一個比較字符串列表與其他列表字符串

List<string> ingoreEducationKeywords= new List<string>(){"Uni", "School", "College",}; 
List<string> userEducation= new List<string>(){"MCS", "BCS", "School of Arts","College of Medicine"}; 

現在,我想它沒有從忽略列表子列表。

要求列表{ 「MCS」, 「BCS」}

+0

使用左外加入。請參閱MSDN:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

+1

@jdweng:我認爲沒有必要加入夜... –

+0

'userEducation.Where(E => ignoreEducationKeywords.All(我=>!e。包含(i)))' – juharr

回答

6

這可與AnyAll構建一個相對簡單的查詢,根據您的喜好:

var res = userEducation 
    .Where(s => !ingoreEducationKeywords.Any(ignored => s.Contains(ignored))) 
    .ToList(); 

var res = userEducation 
    .Where(s => ingoreEducationKeywords.All(ignored => !s.Contains(ignored))) 
    .ToList(); 

如果列表是非常大的,你可以通過使用正則表達式同時匹配所有單詞提高性能:

var regex = new Regex(
    string.Join("|", ingoreEducationKeywords.Select(Regex.Escape)) 
); 
var res = userEducation.Where(s => !regex.IsMatch(s)).ToList(); 

Demo.

+0

謝謝,是的,這是工作 –

3

您可以使用WhereAnyContains

var list = userEducation.Where(ed => !ingoreEducationKeywords.Any(ik => ed.Contains(ik))); 

它搜索所有出現在userEducation當教育沒有在任何比賽ingoreEducationKeywords

+0

像喬恩你失蹤了一個尾隨''' – juharr

+1

像喬恩我不能計數@juharr :)謝謝 –

4

這是措辭的問題,你的方式想要的東西,導致自然翻譯成LINQ:

  • 你想從userEducation項目(即暗示你會userEducation開始)
  • ignoreEducationKeywords沒有有子。
    • 「無」 等同於 「沒有任何」
    • 要檢查是否有子,你可以使用Contains

這導致:

var query = userEducation 
    .Where(candidate => !ignoredKeyWords.Any(ignore => candidate.Contains(ignore))); 

同樣的思維過程可以幫助許多其他查詢。

另一種選擇是創建自己的None擴展方法,假設你使用LINQ to對象:

public static class Extensions 
{ 
    public static bool None(this IEnumerable<T> source, Func<T, bool> predicate) 
     => !source.Any(predicate); 
} 

然後,你可以重寫查詢,而不否定:

var query = userEducation 
    .Where(candidate => ignoredKeyWords.None(ignore => candidate.Contains(ignore))); 
+0

@Berkay:修正,謝謝。 –

0
List<string> ingoreEducationKeywords = new List<string>() { "Uni", "School", "College", }; 
List<string> userEducation = new List<string>() { "MCS", "BCS", "School of Arts", "College of Medicine" }; 

var result = userEducation.Where(r => !ingoreEducationKeywords.Any(t => r.Contains(t))).ToList();