比较2个列表与一个具有空值的列表

时间:2017-02-15 06:16:10

标签: c# linq

我有一个班级

public class User
{
    public int id { get; set; }
    public string code { get; set; }
}

我想找到具有特定代码值的用户

List<User> users = new List<User>();

users.Add(new User() { id = 1, code="A"});
users.Add(new User() { id = 2, code = null });
users.Add(new User() { id = 3, code = "C" });
users.Add(new User() { id = 4, code = "C" });
users.Add(new User() { id = 5, code = "B" });

string[] possibleValues = new string[] { null, "A", "B" };

var result = users
  .Where(u => possibleValues
                .Any(l => l.Equals(u.code)))
  .ToList();

我得到NullReferenceException,因为possibleValues中有null。我明白那个。有人可以提出更好的方法。

4 个答案:

答案 0 :(得分:3)

您正在比较string,我建议将l.Equals(...)更改为string.Equals(...),知道如何处理null

  ...
  // string.Equals(l, u.code):
  //   do l and u.code equal? i.e. are they both nulls 
  //   or do they contain the equal strings 
  var result = users
    .Where(u => possibleValues.Any(l => string.Equals(l, u.code)))
    .ToList();

请注意,如果您愿意,可以调整 string.Equals,例如 string.Compare(l, u.code, StringComparison.OrdinalIgnoreCase)

答案 1 :(得分:1)

您可以将WhereAny一起使用,并添加过滤器以忽略 null 值,如下所示: -

var result = users.Where(x => possibleValues
               .Any(z => z == x.code && (z != null || x.code != null)));

<强>更新

基于与@Dmitry的讨论(这对我来说很有意义)你可以这样简化它: -

var result = users.Where(x => possibleValues.Any(z => z == x.code));

Working Fiddle.

答案 2 :(得分:0)

您可以尝试object.ReferenceEquals代替l.Equals。在您的情况下,l在迭代中为空时,它不包含.Equals()的定义以及导致错误的定义。您可以使用以下代码尝试相同的操作:

users.Where(u => possibleValues.Any(l => object.ReferenceEquals(l,u.code))).ToList();

上面的代码会为您提供示例中ID为125的项目。

答案 3 :(得分:0)

试试这个你可以从这段代码中删除空值

var result = users.Where( y=> possibleValues
               .Any(u => u == y.code && (u != null || y.code != null)));