我有一个班级
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
。我明白那个。有人可以提出更好的方法。
答案 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)
您可以将Where
与Any
一起使用,并添加过滤器以忽略 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));
答案 2 :(得分:0)
您可以尝试object.ReferenceEquals
代替l.Equals
。在您的情况下,l
在迭代中为空时,它不包含.Equals()
的定义以及导致错误的定义。您可以使用以下代码尝试相同的操作:
users.Where(u => possibleValues.Any(l => object.ReferenceEquals(l,u.code))).ToList();
上面的代码会为您提供示例中ID为1
,2
和5
的项目。
答案 3 :(得分:0)
试试这个你可以从这段代码中删除空值
var result = users.Where( y=> possibleValues
.Any(u => u == y.code && (u != null || y.code != null)));