我正在尝试使用linq更新MVC-Combobox网站Selected
的{{1}}属性。但是这不起作用,如debbuging结果所示:条件的IEnumerable<SelectListItem>
返回一个项目,但Count()
的{{1}}返回0。
Count()
更新:
我想问题更多地绑定到.Selected == true
,因为将类别更改为public IEnumerable<SelectListItem> Categories { get; set; }
public CategoryModel Category
{
get { return category; }
set
{
category = value;
Categories.Where(x => x.Value == value.Id.ToString()).First().Selected = true;
}
//Debugging Results
//?Categories.Where(x => x.Value == value.Id.ToString()).Count()
//1
//?Categories.Count(x => x.Selected == true);
//0
}
之后它运行正常(例如下面的代码),即使Lin Q 不是为改变数据......
IEnumerable<SelectListItem>
答案 0 :(得分:4)
LIN Q 是查询您的数据源,不要修改它。
您当前的方法无论如何都有缺点,您可以选择一个,但不会取消选择其他方法。所以你需要一个循环:
public CategoryModel Category
{
get { return category; }
set
{
category = value;
// consider to use a lock here to avoid multi threading issues
foreach(SelectListItem catItem in Categories)
catItem.Selected = catItem.Value == value.Id.ToString();
}
}
如果我修改了一个集合,我会使用方法SetSelectedCategory
而不是属性。
答案 1 :(得分:1)
IEnumerable不保证更改在枚举中保持不变。 这一切都取决于最终的底层实现(List,Array,Observable等)。
您可以选择将实际类别更改为可写集合(如List)... 但是你可能无法做到这一点,或者你可能只是喜欢保持精益并继续使用IEnumerable。 在这种情况下,您可以简单地改变原始集合并将其投影到原始
上void Main()
{
Categories = Load();
var active = new Func<CategoryModel, int, CategoryModel>((category, match) =>
{
return new CategoryModel
{
Id = category.Id,
Name = category.Name,
Active = category.Id == match
};
});
Categories = Categories.Select(p => active(p, 2));
Categories.Dump();
}
public IEnumerable<CategoryModel> Categories { get; set; }
public IEnumerable<CategoryModel> Load()
{
yield return new CategoryModel { Id=1, Name = "one" };
yield return new CategoryModel { Id=2, Name = "two" };
yield return new CategoryModel { Id=3, Name = "three" };
}
public class CategoryModel
{
public int Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
}
Id|Name|Active
1 one False
2 two True
3 three False
这也是为了强调你可以使用linq进行“转换”使用“投影”