C# 使用linq更新值
我正在尝试使用linq为MVC Combobox网站更新C# 使用linq更新值,c#,linq,C#,Linq,我正在尝试使用linq为MVC Combobox网站更新IEnumerable的Selected属性。但是,这不起作用,如去bug结果所示:条件的Count()返回一个项,而的Count()返回0 public IEnumerable<SelectListItem> Categories { get; set; } public CategoryModel Category { get { return category; } set {
IEnumerable
的Selected
属性。但是,这不起作用,如去bug结果所示:条件的Count()
返回一个项,而的Count()
返回0
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
}
LINQ是查询您的数据源而不是修改它
无论如何,您当前的方法有一个缺点,您可以选择一个,但不会取消选择其他方法。所以你需要一个循环:
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
而不是属性。LINQ是查询您的数据源而不是修改它
无论如何,您当前的方法有一个缺点,您可以选择一个,但不会取消选择其他方法。所以你需要一个循环:
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
而不是属性。IEnumerable不能保证更改在枚举中持久化。
这一切最终都取决于底层实现(列表、数组、可观察对象等)
您可以选择将实际类别更改为可写集合(如列表)。。。
但您可能无法做到这一点,或者您可能只是希望保持精简并继续使用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
void Main()
{
类别=加载();
活动变量=新函数((类别,匹配)=>
{
返回新的CategoryModel
{
Id=类别。Id,
名称=类别。名称,
活动=类别。Id==匹配
};
});
类别=类别。选择(p=>active(p,2));
类别。Dump();
}
公共IEnumerable类别{get;set;}
公共IEnumerable负载()
{
返回新的CategoryModel{Id=1,Name=“one”};
返回新的CategoryModel{Id=2,Name=“two”};
返回新的CategoryModel{Id=3,Name=“three”};
}
公共类类别模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
Id |名称|激活
一个错误
2两个是真的
3三个错误
这也是为了强调,您可以使用linq进行使用“投影”的“转换”IEnumerable并不能保证更改在枚举中持久化。
这一切最终都取决于底层实现(列表、数组、可观察对象等)
您可以选择将实际类别更改为可写集合(如列表)。。。
但您可能无法做到这一点,或者您可能只是希望保持精简并继续使用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
void Main()
{
类别=加载();
活动变量=新函数((类别,匹配)=>
{
返回新的CategoryModel
{
Id=类别。Id,
名称=类别。名称,
活动=类别。Id==匹配
};
});
类别=类别。选择(p=>active(p,2));
类别。Dump();
}
公共IEnumerable类别{get;set;}
公共IEnumerable负载()
{
返回新的CategoryModel{Id=1,Name=“one”};
返回新的CategoryModel{Id=2,Name=“two”};
返回新的CategoryModel{Id=3,Name=“three”};
}
公共类类别模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
Id |名称|激活
一个错误
2两个是真的
3三个错误
这也是为了强调,您可以使用linq进行“转换”,使用“投影”“不工作”不是一个充分的错误描述。任何异常、错误消息、未执行的行为?顺便说一句:LINQ代表“语言集成查询语言”,它用于查询,而不是用于副作用和改变事物。顺便说一句,您当前的方法将选择一个,但如果已经选择了另一个,则不会取消选择除了@TimSchmelter指出的缺陷之外,此处未显示的代码中肯定还有其他错误,因为如果设置了Category的值,则必须在找到的项目上更新所选的值,否则将引发异常。您是否100%确定在代码执行过程中已达到set-on-Category属性?对于投票否决此问题的任何人。我认为这不合适!如果您仔细阅读代码,OP面临的问题是显而易见的。没有必要否决它。如果他误解了LINQ这样的概念,请帮助他!不要投反对票。他没有要求你做他的家庭作业!这是一个non到目前为止能够实际解决的实际问题。您在哪里设置了调试器制动点First()。如Gerrie所述,如果没有具有该ID的项,则选中的
将引发异常。因此,必须在一个项上将该属性设置为true。您在哪里检查类别。计数(x=>x.Selected==true)
?“不工作”不是足够的错误描述。任何异常、错误消息、未执行的行为?顺便说一句:LINQ代表“语言集成查询语言”,它用于查询,而不是用于副作用和改变事物。顺便说一句,您当前的方法将选择一个,但如果已经选择了另一个,则不会取消选择除了@TimSchmelter指出的缺陷之外,此处未显示的代码中肯定还有其他错误,因为如果设置了Category的值,则必须在找到的项目上更新所选的值,否则将引发异常。您是否100%确定在代码执行过程中已达到set-on-Category属性?对于投票否决此问题的任何人。我认为这不合适!如果您仔细阅读代码,OP面临的问题是显而易见的。没有必要否决它。如果他误解了LINQ这样的概念,请帮助他!不要投我的反对票