2013-02-13 35 views
0

型号Linq在列表中设置属性?

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

的LINQ

entity.MeterReadingTypes; 

有迹象表明,有真或假值的记录,我想只设定一个值设置为true,别人虚伪。

原单列表

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

是否有任何优雅的解决方案?

+1

'Select'和'Where'都是关于查询*而不是*设置*属性的。 (事实上​​,这正是LINQ的目标。)目前尚不清楚你想要实现的目标。 – 2013-02-13 08:00:20

+0

对不起,我的意思是.select(x => new {isSelected = true}) – 2013-02-13 08:04:14

+0

如何识别哪个项目设置为“true”? – 2013-02-13 08:27:54

回答

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版本。

0

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

foreach (var unselectedType in entity.MeterReadingTypes) 
{ 
    unselectedType.IsSelected = (unselectedType.Name == "C"); 
}