如何在一个列表中为Id设置标志';与Id';在另一个列表中使用Lambda表达式c#
我有两张单子如何在一个列表中为Id设置标志';与Id';在另一个列表中使用Lambda表达式c#,c#,list,lambda,C#,List,Lambda,我有两张单子 public class class1{ public Int Id { get; set; } public Bool Flag{ get; set; } } public class class2{ public Int Id { get; set; } } 现在我有了列表和列表, 现在,我必须使用lambda表达式c#在列表中将Flag属性更新为true,仅适用于那些与列表中存在的Id相匹配的Id。不想使用foreach 使用lambda表达式。我不想用foreac
public class class1{
public Int Id { get; set; }
public Bool Flag{ get; set; }
}
public class class2{
public Int Id { get; set; }
}
现在我有了列表
和列表
,
现在,我必须使用lambda表达式c#在列表
中将Flag属性更新为true,仅适用于那些与列表
中存在的Id相匹配的Id。不想使用foreach
使用lambda表达式。我不想用foreach
这通常是一个愚蠢的要求,也是一个你不太熟悉C#、Linq或性能分析的特点。您有一个要修改其元素的集合,因此应该使用foreach()
如果您正在尝试函数式编程,那么应该将列表元素视为不可变的,并投影到新集合中
问题的第一部分是,根据另一个集合的元素属性中的某个属性查找要修改的列表元素:
现在使用foreach()
,这将很简单:
foreach (var l1 in elementsToModify)
{
l1.Flag = true;
}
或者,更密集(并非代码越少就意味着性能越高):
这是你的密码。但是您不想使用foreach()
。然后您需要投影到一个新集合中:
var newList1 = list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id))
.Select(l1 => new Class1
{
Id = l1.Id,
Flag = true,
})
.ToList();
这是一个只包含标记项的
列表。或者,您可以在foreach()
中使用此列表来更新原始的list1
。哦,等等。下面的解决方案不使用经典的“for each”,而是在引擎盖下编译成一个。如果这不是你的意思,那么请解释一下你想要实现什么。在本例中使用for each是一种很好的方法。人们也可以使用while
或进行循环,但这真的是这里要问的问题吗
对象定义:
public class MyObject
{
public int Id { get; set; }
public bool Flag { get; set; }
}
列表初始化:
var list = new List<MyObject>()
{
new MyObject() { Id= 1 },
new MyObject() { Id= 2 },
new MyObject() { Id= 3 },
new MyObject() { Id= 4 }
};
var list2 = new List<MyObject>()
{
new MyObject() { Id= 2 },
new MyObject() { Id= 4 }
};
编辑:
一个带有while循环的示例(这样做有点讨厌):
inti=-1;
int numberOfElements=list.Count;
而(++iel.Id==list[i].Id);
}
我想你可以自己写一个for循环…为什么不使用常规的foreach
更新Flag
?为什么lambda表达式是一个要求?那么您到底有什么问题?你能创建一个列表吗?你能创建一个B的列表吗?你能遍历一个列表吗?不管怎样:为什么你必须使用lambda?你以前用过经典的循环吗?因为当你能做一件事的时候,你也能做另一件事。不想重复上面的评论:通常当人们说“我想使用Linq/lambdas,而不是foreach”的时候,他们对你能用Linq和表达式做什么被误导了。为什么你不想使用foreach,即使这可能是最可读和最合乎逻辑的选项呢?更好的答案是,投票给any
,我一定是该打卡的时候了。你的Select()
方法也有话要说,但你同时使用了foreach()
和foreach()
,所以…:P
public class MyObject
{
public int Id { get; set; }
public bool Flag { get; set; }
}
var list = new List<MyObject>()
{
new MyObject() { Id= 1 },
new MyObject() { Id= 2 },
new MyObject() { Id= 3 },
new MyObject() { Id= 4 }
};
var list2 = new List<MyObject>()
{
new MyObject() { Id= 2 },
new MyObject() { Id= 4 }
};
list.ForEach(el => el.Flag = list2.Any(el2 => el2.Id == el.Id));
int i = -1;
int numberOfElements = list.Count;
while (++i < numberOfElements)
{
list[i].Flag = list2.Any(el => el.Id == list[i].Id);
}