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);