2013-08-17 107 views
3

嗨,大家好,我有一個LINQ列表從我的模型中的數據庫中獲得。現在我有一個從我的控制器獲得的字符串數組。我想構建一個聲明Linq在哪裏條件匹配數組

僞代碼

List<object> objlist = db.objects.tolist(); 
string[] strarray; // obtained from a long code. 
var k = objlist.Where(u => u.somecol == strarray[0] || u.somecol == strarray[1]........strarray[n]).toList(); 

我有點困惑如何做到這一點,因爲我的strarray[]是變長並且可以包含高達1000個字。

回答

7

您可以檢查是否數組使用Array.IndexOf<T> Method包含一些項目:

bool strarrayContainsX = Array.IndexOf<string>(strarray, "X") >= 0; 

然而,我'd r建議您使用HashSet<string>而不是字符串數組來處理超過幾個項目。 The HashSet<T> Class提供了一個Contains Method檢查一組包含了一些項目:

HashSet<string> strset = new HashSet<string>(strarray); 
bool strsetContainsX = strset.Contains("X"); 

然後將得到的查詢是這樣的:

var k = objlist.Where(u => strset.Contains(u.somecol)).ToList(); 
+0

如果您使用通用的'IndexOf'方法,則可以省略''類型參數,因爲它可以被推斷出來。如果你使用Linq擴展,還有'strarray.Contains(「X」)'。但是,當然'HashSet'對大型集合來說效果更好。 –

1
var k = objlist.Where(u => strarray.Any(x=>x == u.somecol)).ToList(); 
+0

LINQ的有'.Any'擴展方法,但LINQ的也有' .Contains'擴展方法,並且你可以擺脫最內層的lambda。 –

+0

@JeppeStigNielsen是的,這是正確的,但是我熟悉這一點,提交後,我意識到已經有一些其他答案使用'Contains',所以我讓它保持不變。 –

2

使用Contains

var k = objlist.Where(u => strarray.Contains(u.somecol)).toList(); 
3

試試這個:

List<object> objlist = db.objects.tolist(); 
string[] strarray; // obtained from a long code. 
var k = objlist.Where(u => strarray.Contains(u.somecol)).toList();