2014-11-14 112 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扩展。