2014-11-14 50 views
-1

任何人都可以幫我將這幾行代碼轉換爲linq語句嗎?不太熟悉linq語句,如果有人能幫助我,我將不勝感激。C#Xamarin代碼Linq的說明

var searchFor = constraint.ToString(); 
for (int i = 0; i < allUserList.Count; i++) { 
    if (allUserList[i].FirstName.ToLower().Contains(searchFor) || 
     allUserList[i].LastName.ToLower().Contains(searchFor)) { 
     userInfoList.Add(allUserList[i]); 
    } 
} 

回答

1

可以使用的AddRange:

userInfoList.AddRange(allUserList.Where(a => 
         a.FirstName.ToLower().Contains(searchfor) ||   
         a.LastName.ToLower().Contains(searchfor)); 

Where將返回一個IEnumerable<UserObject>它的AddRange可以用它來填充userInfoList

+0

ToLower是一個函數,所以你需要大括號 – WebFreak001 2014-11-14 14:47:17

+0

@ WebFreak001正確 – Jonesopolis 2014-11-14 14:47:39

0

這是從記憶 - 關於確切的語法沒有保證:

userInfoList = (from x in allUserList 
    where x.FirstName.ToLower().Contains(searchFor) || 
    x.LastName.ToLower().Contains(searchFor) select x).ToList(); 
+2

不要忘記,他想添加項目到列表中,而不是替換查詢的結果。 – Robert 2014-11-14 14:46:53

1

首先,我會建議你移動o UT斯達康的condition statement到一個單獨的方法,因爲它將使代碼更具可讀性,當你使用Linq:

private bool UserNameContains(<your user name> user, string searchFor) 
{ 
    return user.FirstName.IndexOf(searchFor, StringComparision.OrdinalIgnoreCase) != -1 || 
      user.LastName.IndexOf(searchFor, StringComparision.OrdinalIgnoreCase) != -1; 
} 

請注意,我用的IndexOf(...) != -1。這是因爲Contains內部使用相同的方法,但使用StringComparision.Ordinal參數。假設你不關心外殼,那麼使用IndexOf(..., StringComparision.OrdinalIgnoreCase)好多了,這樣你就可以避免降低字符串字符,並防止引入錯誤,以防searchFor包含一個高位字符。

然後,所有你需要做的是:

userInfoList.AddRange(allUserList.Where(user => this.UserNameContains(user, searchFor)); 

,或者如果userInfoList是新的空單,你可以將整個邏輯移動到其變量聲明:

var userInfoList = allUserList.Where(user => this.UserNameContains(user, searchFor).ToList(); 

請注意,您應該添加using System.Linq;使用指令爲了能夠使用Linq擴展。