使用linq更新值

时间:2017-12-18 08:56:16

标签: c# linq

我正在尝试使用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>

2 个答案:

答案 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进行“转换”使用“投影”