Нужно произвести поиск элементов в коллекции этих типов, где один из элементов может быть нулем. Из кода я думаю ясно, что я хочу. Выражение Linq в методе Find вызывает NullReference Exception.
private void simpleButton4_Click(object sender, EventArgs e) {
IEnumerable<MyType> coll = new MyType[] {
null, // Внимание nullnew MyType() { ID = 1},
new MyType() { ID = 2}
};
MyType pat1 = null;
MyType found1 = Find(pat1, coll); // должен вернуть null
MyType pat2 = new MyType() { ID = 3 };
MyType found2 = Find(pat2, coll); // должнен вернуть null (NullReference Exception)
MyType pat3 = new MyType() { ID = 1 };
MyType found3 = Find(pat3, coll); // должен вернить второй элемент коллекции (NullReference Exception)
}
private MyType Find(MyType pattern, IEnumerable<MyType> coll) {
return coll.Where(x=> (pattern == null && x == null) || (pattern != null && pattern.ID == x.ID)).FirstOrDefault();
}
PS. На самом деле я создал метод (код не привожу), который правильно решает задачу, просто он получился достаточно сложным для такой простой задачи. Подозреваю можно как-то по-другому с Linq вывернуться
Здравствуйте, Аноним, Вы писали:
А>PS. На самом деле я создал метод (код не привожу), который правильно решает задачу, просто он получился достаточно сложным для такой простой задачи. Подозреваю можно как-то по-другому с Linq вывернуться
private MyType Find(MyType pattern, IEnumerable<MyType> coll)
{
if (pattern == null)
throw new ArgumentNullException("pattern");
return coll.FirstOrDefault(x => x != null && pattern.ID == x.ID);
}
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, Аноним, Вы писали:
А>>PS. На самом деле я создал метод (код не привожу), который правильно решает задачу, просто он получился достаточно сложным для такой простой задачи. Подозреваю можно как-то по-другому с Linq вывернуться
П>
П>private MyType Find(MyType pattern, IEnumerable<MyType> coll)
П>{
П> if (pattern == null)
П> throw new ArgumentNullException("pattern");
П> return coll.FirstOrDefault(x => x != null && pattern.ID == x.ID);
П>}
П>
Блин, слишком упростил свою задачу для примера, только сейчас дошло. Реальный пример выглядит немного иначе. Я сейчас оформлю
Здравствуйте, Аноним, Вы писали:
А>допустим есть класс
А>
class MyType
А>{
А> public int ID { get; set; }
А>}
А>Нужно произвести поиск элементов в коллекции этих типов, где один из элементов может быть нулем. Из кода я думаю ясно, что я хочу. Выражение Linq в методе Find вызывает NullReference Exception.
А>
На самом деле, учитывая, что MyType это класс, то, в случае, если pattern == null метод Find также будет всегда возвращать null, поэтому можно переписать немного проще:
Здравствуйте, Аноним, Вы писали:
А>В моем первом посте я слишком упросил пример, в итоге накосячил. Реальный пример выглядит примерно так (надеюсь из кода все ясно):
Здравствуйте, Аноним, Вы писали:
А>В моем первом посте я слишком упросил пример, в итоге накосячил. Реальный пример выглядит примерно так (надеюсь из кода все ясно):
Перестановка элементов в коллекции:
IEnumerable<DisplayMyType> coll = new DisplayMyType[] {
new DisplayMyType() { DisplayName = "A", MyType = new MyType() { ID = 1} },
new DisplayMyType() { DisplayName = "B", MyType = new MyType() { ID = 2} },
new DisplayMyType() { DisplayName = "NULL", MyType = null }
};
и уже это "(pattern == null)" не работает