C# 将多个值更新到c中的对象列表#
如何更新列表中对象的多个属性C# 将多个值更新到c中的对象列表#,c#,list,C#,List,如何更新列表中对象的多个属性 foreach(emp e in emps){ list1.Where(x => x.ID == e.ID && x.Salary < 5000).FirstOrDefault().Level = B; list1.Where(x => x.ID == e.ID && x.Salary < 5000).FirstOrDefault().Hike = e.Hike; list1.Where
foreach(emp e in emps){
list1.Where(x => x.ID == e.ID && x.Salary < 5000).FirstOrDefault().Level = B;
list1.Where(x => x.ID == e.ID && x.Salary < 5000).FirstOrDefault().Hike = e.Hike;
list1.Where(x => x.ID == e.ID && x.Salary < 5000).FirstOrDefault().Salary = (e.Hike + 100)*e.Salary/100 ;
}
foreach(emp中的emp e){
列表1.Where(x=>x.ID==e.ID&&x.Salary<5000).FirstOrDefault().Level=B;
列表1.Where(x=>x.ID==e.ID&&x.Salary<5000);
列表1.其中(x=>x.ID==e.ID&&x.Salary<5000).FirstOrDefault().Salary=(e.Hike+100)*e.Salary/100;
}
我不想对每个字段使用多个行内查询。它还应该更新相同的单个对象。
注意:e.ID不是唯一的密钥。列表1可以包含重复的ID您只需查询列表一次
foreach (emp e in emps)
{
var item = list.FirstOrDefault(x => x.ID == e.empID && x.Salary > 5000);
if (item != null)
{
item.Level = B;
item.Hike = e.Hike;
item.Salary = (e.Hike + 100) * e.Salary / 100;
}
}
经过多次尝试。看起来这些都会起作用:
foreach(emp e in emps){
int index = list1.FindIndex(x => x.ID == e.ID && x.Salary < 5000);
if(index != -1)
{
list1[index].Level = 'B';
list1[index].Hike = e.Hike;
list1[index].Salary = (e.Hike + 100)*e.Salary/100;
}
}
foreach(emp中的emp e){
int index=list1.FindIndex(x=>x.ID==e.ID&&x.Salary<5000);
如果(索引!=-1)
{
列表1[索引]。级别='B';
列表1[index].Hike=e.Hike;
清单1[指数]。工资=(e.Hike+100)*e.Salary/100;
}
}
你们的感受是什么?用你们的班级取代
Foo
foreach (emp e in emps)
{
if (list.FirstOrDefault(x => x.ID == e.empID && x.Salary > 5000) is Foo f)
{
f.Level = B;
f.Hike = e.Hike;
f.Salary = (e.Hike + 100) * e.Salary / 100;
}
}
无显式搜索,无嵌套循环:(如果ID是主键)
如果需要,请附加.OfType()。
var bob=list.Where(x=>x.ID==e.empID&&x.Salary>5000)。FirstOrDefault()代码>然后像其他任何对象一样设置属性。如果您想要更精确的答案,请提供一个包含示例输入的示例。您当前的代码效率低下,因为它在列表中搜索同一对象三次。按照@mjwills的建议做,拉一次对象,然后设置它的属性。我不想对每个字段使用多个行内查询。
没有简单的方法可以做到这一点,就像没有简单的方法可以一次设置(现有)对象的多个属性一样还应该更新同一个对象。
我的建议可以做到。@DragandDrop OP只想更新第一个对象-还应该更新同一个对象。
。。。并修复了.FirstOrDefault()处的潜在NullReferenceException
。级别=B代码>这和我的建议(和@fubo的答案)一样,只是稍微复杂一些,冗长一些,速度也慢一些。这样获取索引是没有意义的。要获得索引,您必须找到该项目-您也可以使用该项目代替!仅供参考:运算符expr的类型为varname
。
foreach(item in list.Join(emps, x=>x.ID, e=>e.empID, (l,e)=> (l,e)).Where(x => x.l.Salary > 5000))
{
item.l.Level = B;
item.l.Hike = item.e.Hike;
item.l.Salary = (item.e.Hike + 100) * item.e.Salary / 100;
}