模型
class MeterReadingTypes
{
int id { get; set;}
bool isSelected { get; set; }
string Name { get; set; }
.....
}
LINQ的
entity.MeterReadingTypes;
有些记录具有真值或假值,我想只设置一个值为true,其他值为false。
原始列表
id | isSelected | Name |
------------------------
1 | false | A |
2 | false | B |
3 | true | C |
3 | true | D |
5 | false | E |
6 | false | F |
7 | true | G |
我想将此列表设置为以下内容:
id | isSelected | .. |
-----------------
1 | false | A |
2 | false | B |
3 | true | C |
4 | false | D |
5 | false | E |
6 | false | F |
7 | false | G |
我可以这样做吗,我只想将一个属性设置为true
?
编辑
我的解决方案
List<OsosPlus2.Core.DataAccess.MeterReadingTypes> types = new List<Core.DataAccess.MeterReadingTypes>();
foreach (var unselectedTypes in entity.MeterReadingTypes)
{
if(unselectedTypes.Name == "C") unselectedTypes.IsSelected = true;
unselectedTypes.IsSelected = false;
types.Add(unselectedTypes);
}
return PartialView(types);
有没有优雅的解决方案?
答案 0 :(得分:2)
LINQ中的'Q'代表查询。查询不会更新任何内容,因此LINQ不是更新对象的正确方法。最简单,最简洁的解决方案是:
foreach(var type in entity.MeterReadingTypes)
type.IsSelected = type.MeterType == typeId;
如果你坚持使用一些LINQ,你可以这样做:
foreach(var unselectedType in entity.MeterReadingTypes
.Where(x => x.MeterType != typeId))
{
unselectedType.IsSelected = false;
}
foreach(var selectedType in entity.MeterReadingTypes
.Where(x => x.MeterType == typeId))
{
selectedType.IsSelected = true;
}
正如您所看到的,它使代码更长。
另一种方法是:
entity.MeterReadingTypes.Select(x => { x.IsSelected = types.MeterType == typeId;
return x; });
同样,简单的foreach
版本没有优势。
答案 1 :(得分:0)
您的解决方案会将所有项目设置为未选中,因为unselectedTypes.IsSelected = false;
是最后一个。你可以这样做:
foreach (var unselectedType in entity.MeterReadingTypes)
{
unselectedType.IsSelected = (unselectedType.Name == "C");
}