如何基于多个复选框</customclass>过滤List <customclass>

时间:2013-11-08 11:34:46

标签: c# silverlight class filtering

我有一个转换为List的XML文件。 PaintClass有几个参数,如颜色(红色或橙色或蓝色)或纹理(平滑或光泽)等。

现在我有一些Checkbox,因此用户可以确定他想要看的PaintClass。例如,他可以同时选择红色和橙色和蓝色,然后每个PaintClass都应该出现。但是当他选择“平滑”复选框时,只显示具有“平滑”纹理的红色/蓝色/橙色涂料。

最好的方法是做什么而不是很多If语句?

亲切的问候, 尼尔斯

2 个答案:

答案 0 :(得分: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);
} 

答案 1 :(得分: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 ));