我有以下代码:合理性检查:这些嵌套的。所有调用都等同于LINQ中相应的.Where和.SelectMany调用吗?
bool b = myList
.SelectMany(x => x.MyList)
.Where(x => x.MyBool)
.SelectMany(x => x.MyList)
.All(x => x.MyBool)
我想是的,但我的同事向我挑战,这一变化可能在某些功能上的不同:
bool b = myList
.All(x => x.MyList
.Where(y => y.MyBool)
.All(y => y.MyList
.All(z => z.MyBool)))
到这是功能上等同情况(例如,如果任何集合是空的,例如)。
虽然答案是肯定或否定,但对于可读性,圈复杂度,时间复杂度和性能方面哪一个更好,也会有所了解。
UPDATE:
所以,我用异型的代码如下:
static void Main(string[] args)
{
var myList = new List<A>();
for (var j = 0; j < 1000; j++)
{
var a = new A();
for (var k = 0; k < 1000; k++)
{
var b = new B {MyBool = true};
for (var l = 0; l < 1000; l++)
{
var c = new C {MyBool = true};
b.MyList.Add(c);
}
a.MyList.Add(b);
}
myList.Add(a);
}
for (var x = 0; x < 10000; x++)
{
bool b1 = Foo(myList);
}
for (var x = 0; x < 10000; x++)
{
bool b2 = Bar(myList);
}
}
private static bool Foo(List<A> myList)
{
return myList
.All(x => x.MyList
.Where(y => y.MyBool)
.All(y => y.MyList
.All(z => z.MyBool)));
}
private static bool Bar(List<A> myList)
{
return myList
.SelectMany(x => x.MyList)
.Where(x => x.MyBool)
.SelectMany(x => x.MyList)
.All(x => x.MyBool);
}
private class A
{
public List<B> MyList => new List<B>();
}
private class B
{
public bool MyBool { get; set; }
public List<C> MyList => new List<C>();
}
private class C
{
public bool MyBool { get; set; }
}
我发现的是,使用.SelectMany
和.Where
第二种方法(Bar
)比快了近80%第一种方法(Foo
)使用嵌套.All
调用。但是这只能在一个非常大的数据集上证明,实际所花的时间非常短。如果每个元素调用一个花费较长时间的查询(例如,到一个数据库),如果实际上性能差异是由于元素被读取的次数所致,那么这对于较小数据集可能更重要。但是,如果差异是由读取元素之间的开销引起的,并且对于任一方法读取元素的次数相同,则我认为无论数据集大小或元素读取时间如何,性能差异总是可以忽略的。
既然'All'对空集返回'true',它们是等价的。什么更好,它是基于意见还是具体实施。 –