Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个值更新到c中的对象列表#_C#_List - Fatal编程技术网

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