将foreach循环重写为linq查询?

时间:2017-12-07 16:52:28

标签: c# linq loops

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

foreach (Obj1 om in List1)
            {
                foreach (Obj2 ol in List2)
                {
                    if (ol.prop == value)
                    {
                       return om.prop
                    }
                }
            }

有人建议查询(如果可能的话)吗?

提前致谢

5 个答案:

答案 0 :(得分:0)

你只能转换其中一个foreach:

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";
}

答案 1 :(得分:0)

您可以执行类似

的操作

List2.SingleOrDefault(x => List1.Any(c => c == x));

显而易见地插入您想要比较的属性。这将返回匹配或null。如果您有多个结果,请将SingleOrDefault更改为Where。

答案 2 :(得分:0)

我认为它会是这样的:

Obj1 obj1 = list1.SingleOrDefault(l => l.list2.(j => j.prop == 1))

Plus prop是第二个列表的属性而不是第一个列表。

您可以在Link

中找到一个很棒的linq课程

答案 3 :(得分:0)

此代码不会受益于使用嵌套循环,如果您在第一次迭代中未达到条件,则可能会增加应用程序执行时间,

您要尝试做的事情可以在此行中进行汇总(基于您的代码)

  

如果List1list2

,您想要返回ol.prop==value中的第一个元素

基于我会这样做:

return List1.FirstOrDefault(om=> List2.Any(ol=>ol.prop == value))?.prop

答案 4 :(得分:0)

以下是与使用循环产生完全相同结果的代码段:

result = List1.FirstOrDefault(om => om.List2.Any(ol => ol.prop == value))?.prop;

感谢大家,尤其感谢@Nekeniehl