>我有属性 用户类型 列表;我正在使用 List 存在 方法来检查此列表是否包含具有相同属性名称的对象,其中一个作为参数传递。
public User SomeAction(User user)
{
List<User> users = GetUsers();
if(users.Exists(x => x.Name == user.Name))
{
// select user which exist under above criteria
}
}
我的问题是在上述条件下使用什么语句来选择用户?
使用 any 语句。如果语句与任何对象匹配,这将返回 true。
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.any.aspx
if(users.Any(x=>x.Name == user.Name)){
//....
}
编辑:错过了要求用户在检查是否存在后选择用户的部分。如果要为表达式选择第一个匹配项。
var match = users.FirstOrDefault(x=>x.Name.Equals(user.Name));
if(match != null){
//...TODO
}
可能是这样的:
users.Where((x=>x.Name == user.Name).SingleOrDefault();
并且通常可以重构代码以:
List<User> users = GetUsers();
var foundUser = users.Where((x=>x.Name == user.Name).SingleOrDefault();
if(foundUser != null) {
//DO SOMETHING AS THERE IS A USER
}
所以避免双重查询。
注意:这里我假设User
是引用类型,因此它的默认值为 null
。
使用 FirstOrDefault
- 如果不符合您的条件的用户不存在,它将返回null
,否则返回匹配的用户:
users.FirstOrDefault(u => u.Name == user.Name)
您也可以使用 SingleOrDefault
如果应该只有一个符合您条件的用户。
使用单个,仅获取一个用户,并在有多个同名用户时获取异常
var user = users.Single(x=>x.Name==user.Name);
users.Single(x=>x.Name == user.Name)
其他一些事情尝试使用String.Equals
users.Single(x=>String.Equals(x.Name, user.Name))
User user = users.FirstOrDefault(x=>x.Name == user.Name)
if(user != null)...