2013-11-08 2 views
0

У меня есть XML-файл, преобразованный в список. В PaintClass есть несколько параметров, таких как цвет (красный или оранжевый или синий) или текстура (гладкая ИЛИ глянцевая) и т. Д.Как фильтровать список <CustomClass> на основе нескольких флажков

Теперь у меня есть несколько флажков, чтобы пользователь мог определить, что PaintClass он хотел бы видеть. Например, он может одновременно выбирать красный и оранжевый и синий, а затем каждый PaintClass должен появиться. Но когда он выбирает флажок «Сглаживание», появляется только красная/синяя/оранжевая краска с гладкой текстурой.

Каков наилучший способ сделать это вместо множества If-утверждений?

С наилучшими пожеланиями, Нильс

ответ

1

Простое решение состоит в:

List<Color> allowedColors = new List<Color>(); 
if (redCheckBox.IsChecked) 
    allowedColors.Add(Color.Red); 
. 
. 
. 
List<Texture> allowedTextures = new List<Texture>(); 
if (smoothCheckBox.IsChecked) 
    allowedTextures.Add(Texture.Smooth); 
. 
. 
. 

filtered = paintList.Where(p => allowedColors.Contains(p.Color) && 
           allowedTextures.Contains(p.Texture)); 

Другой способ будет хранить значение цвета внутри свойства Tag от флажка, а затем итерации над флажков:

redCheckBox.Tag = Color.Red; 
blueCheckBox.Tag = Color.Blue; 
// etc... 

List<Color> colors = new List<Color>(); 
foreach (Object control in checkboxContainer.Children) 
{ 
    var c = (control as CheckBox); 
    if (null == c) 
    continue; 
    colors.Add(c.Tag as Color); 
} 
+0

Красиво сделано, вот-вот предложит немного волшебства, но вы избили меня :) – Noctis

+0

Я также хотел LINQ, но я видел, как он скатится в бесконечные условия. –

+0

Работал как шарм :)! – Niels

0

Что-то вроде этого в вашем обработчике флажка:

List<Color> colorsToDisplay; 

//add all colors that are checked to colorsToDisplay 
//.. 

List<PaintClass> toDisplay = 
    paintClassList. 
    .Where(p => colorsToDisplay.Any(c => c == p.Color) 
       && (smoothCheckbox.Checked ? p.IsSmooth : true)); 
Смежные вопросы