2014-09-15 5 views
-1

Я новичок в WPF, в моей модели просмотра, я определил один список & Я хочу вернуть подсписку (т. Е. 30 в моем случае) на основе некоторого состояния. Я использовал ниже.where clause in wpf

private readonly IEnumerable<int> _numbers; 
_numbers= new List<int>() {30,60}; 

1. 
public Number 
{ 
get 
{ 
    return (mynum== 30) ? _numbers.Where(x => x == 30) 
         .ToList() 
        : _numbers; 
    } 
} 

OR 
2. 
public Number 
{ 
get 
{ 
    return (mynum== 30) ? new list<int>() {30} : _numbers; 
    } 
} 

какой из них правильный/правильный способ сделать это? does where where всегда создает новый список или возвращает извлеченный список?

Спасибо,

+0

Каков тип возвращаемого свойства 'Number'? – pushpraj

+0

В любом случае я бы не стал возвращать основной элемент '_numbers', но всегда копию, иначе недобросовестный клиент мог бы напрямую изменить содержимое списка. –

ответ

0

Отвечая на ваши вопросы.
Предложение Where не возвращает новый список. Он возвращает Enumerable.Iterator<TSource>, применяя предикат (условие) к каждому элементу источника. Таким образом, вы можете изменять исходные элементы из исходного списка, поскольку ссылки указывают на одни и те же объекты.

С другой стороны, применение .ToList() создает копию, так что вы можете не вреда оригинальная коллекция:

var copy = source.ToList(); 

, который так же, как

var copy = new List<TSource>(source); 

Так анализирующий код, который вы мы опубликовали, что у нас есть функционально одинаковые фрагменты для обоих. После его обобщения немного, чтобы он выглядел таким же:

public Number 
{ 
    get 
    { 
     var copy = _numbers.Where(x => x == 30).ToList(); 
     // which is the same as 
     var filteredList = _numbers.Where(x => x == 30); 
     copy = new List<int>(filteredList); 
     return (mynum == 30) ? copy : _numbers; 
    } 
} 
0

Эти два примера не являются точно так же, потому что первая потенциально возвращать несколько экземпляров «30» (предполагается, что _numbers на самом деле не зашиты до всего лишь 30 и 60), в то время как второй будет всегда возвращать только один результат 30.

Лично я считаю, что первый вариант имеет больше смысла в большинстве ситуаций, но без понимания ваших потребностей никто не может действительно сказать точно.