Linq在列表中设置了一个属性?

时间:2013-02-13 07:57:28

标签: linq

模型

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

有没有优雅的解决方案?

2 个答案:

答案 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");
}