【发布时间】:2020-02-07 20:33:17
【问题描述】:
我已尽力在标题中进行解释,但我正在努力实现为 linq 语句提供“别名”并仍以点表示法使用它们。请允许我进一步解释。
下面我们有一个应用了 linq 语句的列表:
private List<string> _matches;
var output = _matches.Where(x => x.EntityScore == 100).ToList();
我同意这很容易阅读。但是,我希望进一步简化它,尤其是当语句开始变大时。这是 linq 变得比我关心的更长的示例:
private List<string> _matches;
var matchAddressList = _matches.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
&& x.StateProvinceDistrict.Equals(inputObject.State)
&& x.City.Equals(inputObject.City))).ToList();
我要做的是给某些 LINQ 组起别名,然后将该 linq 称为点运算符
例如:
var finalOutput = _matches.perfectMatches().addressMatches(inputObject).someOtherMatchCondition(inputObject)
我认为上面的行很清晰易读。未来的开发者不一定要研究逻辑。他们可以阅读业务域名并了解它的作用。 我想避免以下行,因为我相信前面的代码更干净:
var finalOutput = someOtherMatchCondition(addressMatches(perfectMatches(_matches)));
上一行是我觉得你会如何使用基本级别的函数。但是,我正在努力寻找一种方法来创建别名或将 linq 逻辑封装到 business domain name 中,然后将其用作点运算符。
我已经尝试过表达式主体定义:
public List<string> perfectMatches => _matches.Where(x => x.EntityScore == 100).ToList();
这是否需要扩展另一个类?还是写泛型?还是我可能不知道这样做的标准方法?
【问题讨论】:
-
LINQ 本身是由扩展方法组成的。正如 Blechdose 和 Jason 所评论的,您需要实现自己的扩展方法
PerfectMatches。您可以在 github.com/microsoft/referencesource/blob/master/System.Core/… 查看 LINQ 源代码本身 - 这可能会有所帮助。
标签: c# linq variables chaining