Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 谓词冗余的提取_C#_Linq_Predicate - Fatal编程技术网

C# 谓词冗余的提取

C# 谓词冗余的提取,c#,linq,predicate,C#,Linq,Predicate,但我真的想不出有什么东西是那样的。 C#支持这种谓词嵌套吗 编辑:谓词方法比这复杂得多,它们可以有70多行代码,这些代码被每个嵌套对象相乘。。其中(x=>x.B.C.D.Value==4)?漂亮、简短、表达和明确,不需要那些谓词。我同意@TheGeneral,你为什么需要嵌套这么多谓词?谓词应该是快速、易于阅读和维护的。把它们放在巢穴里只会违背它们的目的,使它很难阅读。如果您有一个复杂的任务,请使用一个类。您可以结合“嵌套的”表达式自己构建表达式,但我认为在这种简单的情况下,它不值得付出努力,只

但我真的想不出有什么东西是那样的。 C#支持这种谓词嵌套吗


编辑:谓词方法比这复杂得多,它们可以有70多行代码,这些代码被每个嵌套对象相乘。

。其中(x=>x.B.C.D.Value==4)
?漂亮、简短、表达和明确,不需要那些谓词。我同意@TheGeneral,你为什么需要嵌套这么多谓词?谓词应该是快速、易于阅读和维护的。把它们放在巢穴里只会违背它们的目的,使它很难阅读。如果您有一个复杂的任务,请使用一个类。您可以结合“嵌套的”表达式自己构建表达式,但我认为在这种简单的情况下,它不值得付出努力,只会降低可读性和可维护性。@一般来说,这对简单谓词有效,但是,当逻辑非常复杂,谓词方法需要70多行代码时,它基本上是每次嵌套对象时的乘法。该方法可能存在错误这一事实是另一回事。根据您的用例,此库可能会有所帮助:
。其中(x=>x.B.C.D.Value==4)
?漂亮、简短、表达和明确,不需要那些谓词。我同意@TheGeneral,你为什么需要嵌套这么多谓词?谓词应该是快速、易于阅读和维护的。把它们放在巢穴里只会违背它们的目的,使它很难阅读。如果您有一个复杂的任务,请使用一个类。您可以结合“嵌套的”表达式自己构建表达式,但我认为在这种简单的情况下,它不值得付出努力,只会降低可读性和可维护性。@一般来说,这对简单谓词有效,但是,当逻辑非常复杂,谓词方法需要70多行代码时,它基本上是每次嵌套对象时的乘法。该方法可能存在错误这一事实是另一回事。根据您的用例,此库可能会有帮助:
var listOfAs = new List<A>();   
var listOfBs = new List<B>();
listOfAs.AsQueryable().Where(PredicateForA(6));
listOfBs.AsQueryable().Where(PredicateForB(5));

private Expression<Func<A, bool>> PredicateForA(int value)
    => x => x.B.C.D.Value == value;
private Expression<Func<B, bool>> PredicateForB(int value)
    => x => x.C.D.Value == value;
private Expression<Func<C, bool>> PredicateForC(int value)
    => x => x.D.Value == value;
private Expression<Func<D, bool>> PredicateForD(int value)
    => x => x.Value == value;
listOfBs.Where(x => PredicateForD(5, x.C.D));