Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
如何在一个列表中为Id设置标志';与Id';在另一个列表中使用Lambda表达式c#_C#_List_Lambda - Fatal编程技术网

如何在一个列表中为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);
}