2017-02-15 92 views
3

我有一个类比较2列出了用null值

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

在这里,您可以简单地使用'=='运算符。当查看[String code](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/string.cs)时,== ==运算符具有以下代码:'public static bool operator = =(String a,String b){0}返回String.Equals(a,b); }'。所以这个代码'possibleValues.Any(l => l == u.code)'将会工作得很好。 – dee

+0

是的,我同意你的意见。在看完德米特里的回答后,我明白了这一点。然而。我更喜欢他的回答,因为这给了我灵活地添加StringComparison.OrdinalIgnoreCase – Rajat

+0

好吧,在这种情况下,您确实需要直接调用'string.Equals'静态方法,因为'string'上的'=='运算符执行一个序数敏感和文化不敏感)的比较。 – dee

回答

3

你比较string动手清除空值,这是whay我建议改变l.Equals(...)string.Equals(...)一个知道如何处理null S:

... 
    // 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)

0

您可以尝试object.ReferenceEquals而不是l.Equals。在你的情况下,当迭代中l为空时,它不包含.Equals()的定义并导致错误。您可以通过下面的代码尝试相同:

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

上面的代码会给你的ID 1,在本例中25的项目。

+0

赞赏投票,谢谢 –

+0

为什么投票弃权。我实际上正在考虑使用@RajatMalik这个 – Rajat

+0

:通常我会因个人报复而陷入困境,忘记这一点。很高兴为您提供 –

1

您可以使用WhereAny和添加过滤器忽略这样值: -

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

UPDATE:

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

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

Working Fiddle.

+0

希望他在'possibleValues'中包含'null'以获得结果为id为'2'的项目但是您的代码不包括输出 –

+0

@ un-lucky - 但OP从未提及过,如果他真的想要'2'。虽然它需要一个小小的修复:'x.code == null'而不是'x.code!= null' :) –

+0

我们不是要获得* three *'user's,而不是* two * with code' “A”,“B”和** null **?只有代码为'2'时,您的小提琴演示才会返回代码'1'和'5'。 –

0

尝试这个U可以从这个代码

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

''' z'与'u'与Rahul的答案有什么不同? –

+1

你是否因为他的评论而冷静下来?不道德。 – Berkay

+0

@Berkay:听起来没错,但是谁知道真相 –