1

模型

class MeterReadingTypes 
{
    int id { get; set;}
    bool isSelected { get; set; }
    string Name { get; set; } 
    .....
}

林克

entity.MeterReadingTypes;

有些记录具有真值或假值,我只想将一个值设置为真,其他值为假。

原始清单

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);

有什么优雅的解决方案吗?

4

2 回答 2

3

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版本没有优势。

于 2013-02-13T08:01:46.070 回答
0

您的解决方案会将所有项目设置为未选中,因为unselectedTypes.IsSelected = false;最后出现。你可以这样做:

foreach (var unselectedType in entity.MeterReadingTypes)
{
    unselectedType.IsSelected = (unselectedType.Name == "C");
}
于 2013-02-13T09:47:06.670 回答