我尝试在一个“优雅”的linq查询中重写以下循环,但没有成功!
foreach (Obj1 om in List1)
{
foreach (Obj2 ol in List2)
{
if (ol.prop == value)
{
return om.prop
}
}
}
有人建议查询(如果可能的话)吗?
提前致谢
答案 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)
此代码不会受益于使用嵌套循环,如果您在第一次迭代中未达到条件,则可能会增加应用程序执行时间,
您要尝试做的事情可以在此行中进行汇总(基于您的代码)
如果
,您想要返回List1
有list2
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