C# 是否将foreach循环重写为linq查询?
我试图在一个优雅的linq查询中重写以下循环,但没有成功C# 是否将foreach循环重写为linq查询?,c#,linq,loops,C#,Linq,Loops,我试图在一个优雅的linq查询中重写以下循环,但没有成功 foreach (Obj1 om in List1) { foreach (Obj2 ol in List2) { if (ol.prop == value) { return om.prop
foreach (Obj1 om in List1)
{
foreach (Obj2 ol in List2)
{
if (ol.prop == value)
{
return om.prop
}
}
}
如果可能的话,有人能提出一个问题吗
提前感谢您只能转换以下各项之一:
class Program
{
static void Main(string[] args)
{
var test = Get("yes");
}
public static object Get(string value)
{
List<Obj1> List1 = new List<Obj1>();
List1.Add(new Obj1());
List<Obj2> List2 = new List<Obj2>();
List2.Add(new Obj2());
return (from om in List1
where List2.Any(ol => ol.prop == value)
select om.prop).FirstOrDefault();
}
}
public class Obj1
{
public string prop => "not";
}
public class Obj2
{
public string prop => "yes";
}
你可以这样做 List2.SingleOrDefaultx=>List1.Anyc=>c==x
明显地插入您想要比较的任何属性。这将返回匹配项或null。如果有多个结果,请将SingleOrDefault更改为Where。我认为应该是这样的: Obj1 Obj1=list1.SingleOrDefaultl=>l.list2.j=>j.prop==1 Plus prop是第二个列表的属性,而不是第一个列表的属性
你可以在这段代码中找到一个很好的linq过程,这段代码没有从使用嵌套循环中获益,如果你在第一次迭代中没有达到这个条件,它会增加应用程序的执行时间 根据您的代码,可以在这一行中总结您正在尝试做的事情 如果list2具有ol.prop==value,则需要返回List1中的第一个元素 基于此,我会这样做:
return List1.FirstOrDefault(om=> List2.Any(ol=>ol.prop == value))?.prop
以下是产生与使用循环完全相同结果的代码段:
result = List1.FirstOrDefault(om => om.List2.Any(ol => ol.prop == value))?.prop;
感谢所有人,尤其是@Nekeniehl在你的尝试中遇到了什么问题,这些尝试是什么?你能告诉我们你已经尝试了什么吗?你为什么还在乎?Linq将做与您的代码完全相同的事情,非常简单易懂。你应该关心真正的问题。列表1和列表2之间有什么联系吗?因为否则这段代码就没什么意义了。如果在外部foreach的第一个循环中从未命中If ol.prop==值;然后,您也不会在任何后续循环中命中它。考虑到目前的例子,外部foreach没有任何意义。谢谢Tareq,我知道这一点,但我想知道是否有任何方法可以骑上所有的em,好吧,因为你第一次返回,你不继续检查其他的。。您可以尝试像var prop=List1.FirstOrDefaultom=>List2.Anyol=>ol.prop==value.prop1这样的方法,其中没有任何意义。布尔结果对于每个om都是相同的,因为om对于List2不重要。Anyol=>ol.prop==value。所以你要么得到完整的列表1,要么什么也得不到,因此不会得到回报。2对于foreach来说,第一个循环从方法体返回也没有意义。当List2.Any为真时,where将获得om。但是我不是Linq方面的专家,也许你是对的,我无法测试它。@TareqB:当你拆分步骤时,可能更明显:bool myBool=List2.Anyol=>ol.prop==value;在列表1中后跟foreach Obj1 om。其中om=>myBool{…}