在使用点符号的函数中封装和使用 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)));
}
}
我尽力在标题中进行了解释,但是我正在努力实现为 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)));
}
}