在使用点符号的函数中封装和使用 LINQ 逻辑

Encapsulation and use of LINQ logic in functions using dot notation

我尽力在标题中进行了解释,但是我正在努力实现为 linq 语句提供 'alias' 并且仍然以点表示法使用它们。请允许我进一步解释。

下面我们有一个应用了 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 逻辑封装到 业务域名 中,然后将其用作点运算符。

我试过表达式 body 定义:

public List<string> perfectMatches => _matches.Where(x => x.EntityScore == 100).ToList();

这是否需要另一个 class 的扩展?还是写泛型?或者我可能不知道这样做的标准方法?

我想你要找的是Extension Methods。您可以让 perfectMatches() 方法成为一个扩展方法,它采用相同的 IEnumerable<string> 和 return。然后你可以将它们链接在一起。

更新:也许这也有帮助:
How to add custom methods for LINQ queries (C#)


必须是扩展方法才能使用点符号。 你的意思是这样的吗?它是伪代码而不是工作。您可能需要尝试使用这些类型或尝试某种通用方法:

public class ProductionCode
{
    public void MyMain()
    {
        var myList = new List<EntityThingType>() { .... };

        var newList = myList.PerfectMatches().AddressMatches(myInputObject).ToList();
    }
}

public static class test
{
    public static IEnumerable<EntityThingType> PerfectMatches(this IEnumerable<EntityThingType> myList)
    {
        return myList.Where(x => x.EntityScore == 100);
    }


    public static IEnumerable<EntityThingType> AddressMatches(this IEnumerable<EntityThingType> myList, MyObjectType inputObject)
    {
        return myList.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
                                                                    && x.StateProvinceDistrict.Equals(inputObject.State)
                                                                    && x.City.Equals(inputObject.City)));
    }
}