2017-02-15 3 views
3

У меня есть класссравнить 2 списков с одним имеющих нулевые значения

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

Здесь вы можете просто использовать оператор '=='. Когда вы смотрите в [Строковый код] (https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/string.cs), то оператор '==' имеет этот код: 'public static bool operator = = (String a, String b) { return 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 с:

... 
    // 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 имеет значение null на итерации, он не содержит определения для .Equals() и вызывает ошибку. Вы можете попробовать то же самое, используя следующий код:

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

Приведенный выше код даст вам элементы с идентификаторами 1, 2 и 5 в примере.

+0

Оцените голос, спасибо –

+0

Зачем голосовать. Я действительно размышлял об использовании этого – Rajat

+0

@ RajatMalik: Обычно я спускаюсь из-за личной мести, забываю об этом. Рад помочь вам –

1

Вы можете использовать Where с Any и добавить фильтры игнорировать нулевые значения, как это: -

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

Надеюсь, что он включил 'null' в' possibleValues', чтобы получить элемент с идентификатором '2' в результате, но ваш код не включает в себя то, что на выходе –

+0

@ un-lucky - Но OP никогда не упоминал об этом, если он действительно хочет '2'. Хотя для этого нужно небольшое исправление: 'x.code == null' вместо' x.code! = Null' :) –

+0

Разве мы не собираемся получать * три * 'пользователя, а не * два * с кодами' «A», «B» и ** null **? Демоверсия Fiddle возвращает коды '1' и' 5' только тогда, когда ожидался код '2'. –

0

Попробуйте это и может удалить нулевое значение из этого кода

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

'x' заменяется на' y' и ' z 'с' u' любая другая разница с ответом Рахула? –

+1

Вы его превзошли из-за его комментариев? Не этично. – Berkay

+0

@Berkay: звучит правильно, но кто знает правду –

Смежные вопросы