Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# 是否将foreach循环重写为linq查询?_C#_Linq_Loops - Fatal编程技术网

C# 是否将foreach循环重写为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

我试图在一个优雅的linq查询中重写以下循环,但没有成功

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{…}