如何使用Lambda表达式C#在一个列表中为与另一个列表中的ID匹配的ID设置标志

时间:2018-09-26 10:49:35

标签: c# list lambda

我有两个列表类

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。

2 个答案:

答案 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”,而是在后台编译为一个。如果这不是您的意思,请解释您要实现的目标。在此示例中为每个对象使用是一种很好的方法。也可以使用whilefor循环,但这真的是这里要问的吗?

对象定义:

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循环...