2013-02-14 5 views
0

G'day all, Есть ли способ заготовки проекции на содержимое окна списка. В частности, я хотел бы иметь возможность сделать это, не снимая и не добавляя содержимое моего списка Это то, что у меня есть.Есть ли более простой способ заготовки проекции на ListItemCollection?

public static void SetSelectedWhere(this ListBox listbox, Func<ListItem,bool> condition) 
{ 
    var queryableList = listbox.Items.Cast<ListItem>(); 
    queryableList.Select(x=>condition(x)?x.Selected:x.Selected=false); 
    listbox.Items.Clear(); 
    listbox.Items.AddRange(queryableList.ToArray<ListItem>()); 
}

и кажется глупым, чтобы очистить существующую коллекцию и добавить содержимое обратно.

Любые мысли

ответ

4

Как насчет простой старой итерации?

foreach (ListItem item in listbox.Items) 
{ 
    item.Selected = condition(item); 
} 

LINQ - это не ответ на всю жизнь и все остальное. В частности, эта часть юниверса включает настройку свойств существующих объектов.

+0

Я бы сказал, что это зависит, LINQ делает меня счастливым, что, по крайней мере, является хорошим ответом на жизнь ;-) –

+0

@jon so linq! = 42 then – Terrance

+1

@AdamHouldsworth: Мой способ сказать, что это «LINQ заставляет меня чувствовать, что я ниндзя» ;-) – Jon

1

Глупо удалять и читать предметы в коллекции, поскольку это совершенно не нужно.

Вы должны быть в состоянии упростить его следующим образом:

foreach (ListItem item in listbox.Items)) { 
    item.Selected = condition(item); 
} 
1
listbox.Items 
     .Cast<ListItem>() 
      .Where(x=> condition(x)) 
       .ToList() 
         .ForEach(item => item.Selected = true); 

List<T> имеет метод ForEach, и вы можете выполнить действие для любого из пунктов в списке:

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