1

我有列表类型的属性用户;我正在使用 List Exists 方法检查此列表是否包含具有相同属性名称的对象,其中一个作为参数传递。

public User SomeAction(User user)
{
   List<User> users = GetUsers();
   if(users.Exists(x => x.Name == user.Name))
   {
      // select user which exist under above criteria
   }
}

我的问题是在上述条件下使用什么语句来选择用户?

4

6 回答 6

2

使用 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
}
于 2013-11-08T09:28:32.853 回答
1
users.Single(x=>x.Name == user.Name)

尝试使用其他一些String.Equals东西

users.Single(x=>String.Equals(x.Name, user.Name))
于 2013-11-08T09:26:34.583 回答
1

可能是这样的:

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.

于 2013-11-08T09:26:43.910 回答
1

使用FirstOrDefault-null如果不存在与您的条件匹配的用户,则返回,否则返回匹配的用户:

users.FirstOrDefault(u => u.Name == user.Name)

SingleOrDefault如果应该只有一个用户符合您的条件,您也可以使用。

于 2013-11-08T09:27:14.110 回答
1
User user = users.FirstOrDefault(x=>x.Name == user.Name)
if(user != null)...
于 2013-11-08T09:27:36.777 回答
1

使用 single,如果有多个同名用户,则只获取一个用户并获取异常

var user = users.Single(x=>x.Name==user.Name);
于 2013-11-08T09:27:50.360 回答