2015-02-23 96 views
0

我有下面的類LINQ的選擇,其中在列表

public class Group 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

和2列出List<string> groupRestrictList<Group> groups

現在組列表包含一些團體已填寫所有領域,我想選擇的所有限制groupRestrict列表只包含組的名稱。

我嘗試了一些東西,但出於某些原因,它總是返回一個空列表。這是我的最後一次測試:

var lst = groups.Where(j => groupRestrict.Contains(j.Name)).ToList();

任何線索可能什麼錯?

編輯:像評論說,這應該有工作,這是有一些'輸入,但現在我想有該groupRestrict不必是確切的名稱,但可以用'像'功能。

當前表達式:

var restrictedGroups = (from gr in groupRestrict join g in groups on gr equals g.Name select g).ToList();

+2

請注意,這是一個bigO--而是在HashSet(或Dictionary)上執行此查詢並考慮使用'.Join'或'.GroupJoin'(無論您想要左連接還是全連接) – 2015-02-23 13:01:16

+0

@AndreasNiedermair它是不在SQL數據庫上,如果這是你所指的:) – Kiwi 2015-02-23 13:02:54

+5

這應該工作。請注意,字符串比較默認情況下區分大小寫。 – helb 2015-02-23 13:03:12

回答

2

嘗試:

var lst = groups.Where(j => groupRestrict.Any(x=> j.Name.Contains(x))).ToList(); 

這將匹配所有組,包含來自searchList一個或多個字符串名稱。

大小寫不敏感的變體將是:

var lst = groups.Where(j => groupRestrict.Any(x=> j.Name.ToLower().Contains(x.ToLower()))).ToList(); 

Allthough這將是更好的groupRestrict轉換之前,在這種情況下,查詢爲小寫,你可以省略.ToLower()調用X:

string[] lowerCaseGroupRestrict = groupRestrict.Select(x=> x.ToLower()).ToArray(); 
var lst = groups.Where(j => lowerCaseGroupRestrict.Any(x=> j.Name.ToLower().Contains(x))).ToList(); 
+0

非常感謝! groupRestrict是一個用戶輸入(儘管它首先被檢查和過濾)。所以事先可以很容易地稱爲:) – Kiwi 2015-02-24 06:59:14

+0

對不起,完全忘了它! :) – Kiwi 2015-02-24 07:32:47