C# 如何使用lambda表达式作为参数?
我有以下方法:C# 如何使用lambda表达式作为参数?,c#,linq,lambda,C#,Linq,Lambda,我有以下方法: private List<TSource> Sort<TSource, TKey>( List<TSource> list, Func<TSource, TKey> sorter, SortDirection direction) { ... } 我不确定这是否可能,但如果可能,如何实现这一点?我不想重复代码。是的,您可以将lambda分配给一个变量: Func<CustomType, s
private List<TSource> Sort<TSource, TKey>(
List<TSource> list,
Func<TSource, TKey> sorter,
SortDirection direction)
{
...
}
我不确定这是否可能,但如果可能,如何实现这一点?我不想重复代码。是的,您可以将lambda分配给一个变量:
Func<CustomType, string> lambda;
switch (sortBy)
{
case "name":
lambda = s => s.Name.ToString();
break;
case "surname":
lambda = s => s.Surname.ToString();
break;
}
orderedList = this.Sort<CustomType, string>(
lstCustomTypes,
lambda,
direction == "ASC" ? SortDirection.Ascending : SortDirection.Descending);
Func lambda;
开关(sortBy)
{
案例“名称”:
lambda=s=>s.Name.ToString();
打破
“姓氏”一案:
lambda=s=>s.姓氏.ToString();
打破
}
orderedList=this.Sort(
根据客户类型,
兰姆达,
方向==“ASC”?排序方向。上升:排序方向。下降);
首先声明lambda变量:
Func<CustomType, string> lambdaExpresion;
Func lambdaExpresion;
在
开关
语句之前。这是可能的,因为两种情况下的lambda类型相同;否则就不可能了。您可以定义一个变量来保存函数本身
Func<CustomType, string> lambdaExpresion;
你基本上已经在那里了:
Func<CustomType, string> lambdaExpresion;
switch (sortBy)
{
case "name":
lambdaExpresion = s => s.Name.ToString();
break;
case "surname":
lambdaExpresion = s => s.Surname.ToString();
break;
case default: //need a default value for it to be definitely assigned.
lambdaExpresion = s => "";
}
orderedList = this.Sort(lstCustomTypes, lambdaExpresion,
direction == "ASC" ? SortDirection.Ascending : SortDirection.Descending);
Func lambdaExpresion;
开关(sortBy)
{
案例“名称”:
lambdaExpresion=s=>s.Name.ToString();
打破
“姓氏”一案:
lambdaExpresion=s=>s.lasname.ToString();
打破
case default://需要一个默认值才能明确指定。
lambdaExpresion=s=>“”;
}
orderedList=this.Sort(lstCustomTypes、lambdaExpresion、,
方向==“ASC”?排序方向。上升:排序方向。下降);
好的,以防没人使用反射:)
orderedList=this.Sort(
根据客户类型,
s=>s.GetType().GetProperty(sortBy).GetValue(s).Tostring(),
方向==“ASC”?排序方向。上升:排序方向。下降);
只需注意不存在的道具或字段,以及不兼容的名称(比如您可能希望首字母大写)。作为练习检查左侧时出错(因为我现在没有测试此代码的框)您已经得到了正确答案。但是,也许您应该改用OrderBy和OrderByDescending: 第一个链接中的示例:
Pet[] pets = { new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 },
new Pet { Name="Whiskers", Age=1 } };
IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age);
Pet[]pets={新宠物{Name=“大麦”,年龄=8},
新宠物{Name=“Boots”,年龄=4},
新宠物{Name=“胡须”,年龄=1};
IEnumerable query=pets.OrderBy(pet=>pet.Age);
您忘记了自定义
输入类型。。。不,但我否决了。事实上,首先它只是一个没有输入参数的func。“立即更改”看起来像是重新创建动态Linq的努力。sortBy
中的值与OP代码中的属性名称不完全匹配。@Servy,我希望他能够解决这个小问题。这就是我在底部留下“免责声明”的原因。
switch (sortBy)
{
case "name":
lambda = s => s.Name;
break;
case "surname":
lambda = s => s.Surname;
break;
}
Func<CustomType, string> lambdaExpresion;
switch (sortBy)
{
case "name":
lambdaExpresion = s => s.Name.ToString();
break;
case "surname":
lambdaExpresion = s => s.Surname.ToString();
break;
case default: //need a default value for it to be definitely assigned.
lambdaExpresion = s => "";
}
orderedList = this.Sort(lstCustomTypes, lambdaExpresion,
direction == "ASC" ? SortDirection.Ascending : SortDirection.Descending);
orderedList = this.Sort<CustomType, string>(
lstCustomTypes,
s => s.GetType().GetProperty(sortBy).GetValue(s).Tostring(),
direction == "ASC" ? SortDirection.Ascending : SortDirection.Descending);
Pet[] pets = { new Pet { Name="Barley", Age=8 },
new Pet { Name="Boots", Age=4 },
new Pet { Name="Whiskers", Age=1 } };
IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age);