我有两个列表类
public class class1{
public Int Id { get; set; }
public Bool Flag{ get; set; }
}
public class class2{
public Int Id { get; set; }
}
现在我有List<class1>
和List<class2>
,
现在,我只需要使用lambda表达式c#将List<class1>
中的Flag属性更新为true,即可与List<class2>
中存在的ID相匹配。不想使用foreach。
答案 0 :(得分:1)
使用lambda表达式。不想使用foreach。
通常这是一个愚蠢的要求,也是您对C#,Linq或性能分析并不真正熟悉的标志。您有一个要修改其元素的集合,因此应使用foreach()
。
如果您正在尝试函数式编程,则应将列表元素视为不可变的,并将其投影到新集合中。
问题的第一部分,根据另一个集合的元素属性is trivial中存在的一个属性,查找要修改的列表元素:
var elementsToModify = list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id));
现在有了foreach()
,这很简单:
foreach (var l1 in elementsToModify)
{
l1.Flag = true;
}
或者,甚至更密集(不是更少的代码等于更高的性能):
foreach (var l1 in list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id)))
{
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();
这里有一个List<Class1>
,其中仅带有标记的项目。 (可选)您可以在foreach()
中使用此列表来更新原始的list1
。哦,等等。
答案 1 :(得分:0)
以下解决方案不使用经典的“ for each”,而是在后台编译为一个。如果这不是您的意思,请解释您要实现的目标。在此示例中为每个对象使用是一种很好的方法。也可以使用while
或for
循环,但这真的是这里要问的吗?
对象定义:
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));
编辑:
一个带有while循环的示例(用这种方式有点讨厌):
int i = -1;
int numberOfElements = list.Count;
while (++i < numberOfElements)
{
list[i].Flag = list2.Any(el => el.Id == list[i].Id);
}
我想您可以自己编写一个for循环...