c# - OrderBy keySelector 在 TKey 上有不同的数据类型
问题描述
我需要一个返回 keySelector 的方法,它可以在调用 OrderBy 表达式时使用。问题是 keySelector 是一个通用委托,我希望该方法在 TKey 上返回具有不同数据类型的 keySelector:
Func<TSource,TKey> keySelector
我想完成此操作,但不是使用 lambda 表达式,而是使用返回 keySelector(TKey=string 或 int)的方法:
IEnumerable<Person> orderedByFirstName = persons.OrderBy(p => p.FirstName);
IEnumerable<Person> orderedByAge = persons.OrderBy(p => p.Age);
是否有可能以某种方式在 TKey 上返回具有不同类型的 keySelectors 的方法?不可能返回 lambda 表达式,但类似的东西......
只要该方法只返回数据类型字符串的 keySelectors 一切正常:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
public class Behavior
{
public virtual string GetOrderByKeySelector(Person p)
{
return p.FirstName;
}
}
public class SpecializedBehavior : Behavior
{
public override string GetOrderByKeySelector(Person p)
{
return p.LastName;
}
}
List<Person> persons = new List<Person>
{
new Person{Age=10, FirstName="Pelle", LastName="Larsson"},
new Person{Age=90, FirstName="Nils", LastName="Nilsson"},
new Person{Age=15, FirstName="Olle", LastName="Johansson"},
new Person{Age=30, FirstName="Kalle", LastName="Svensson"}
};
像这样使用:
SpecializedBehavior behavior = new SpecializedBehavior();
IEnumerable<Person> orderedResult = persons.OrderBy(behavior.GetOrderByKeySelector);
解决方案
不如将集合引入方法中。
void Main()
{
SpecializedBehavior behavior = new SpecializedBehavior();
IEnumerable<Person> orderedResult = behavior.Sort(persons);
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
public class Behavior
{
public virtual IEnumerable<Person> Sort(IEnumerable<Person> persons)
{
return persons.OrderBy(p => p.FirstName);
}
}
public class SpecializedBehavior : Behavior
{
public override IEnumerable<Person> Sort(IEnumerable<Person> persons)
{
return persons.OrderBy(p => p.Age);
}
}
List<Person> persons = new List<Person>
{
new Person{Age=10, FirstName="Pelle", LastName="Larsson"},
new Person{Age=90, FirstName="Nils", LastName="Nilsson"},
new Person{Age=15, FirstName="Olle", LastName="Johansson"},
new Person{Age=30, FirstName="Kalle", LastName="Svensson"}
};
推荐阅读
- javascript - React Native Jest - BABEL 参考错误
- jquery - 在我的情况下,如何从 Json Stringify 读取值?
- html - 框箭头采用相应框的背景颜色
- google-app-maker - 如何创建记录并使其与 Google Apps Maker 中的父级相关联?
- exception - ARM - 异常中的链接寄存器
- html - VBA单击下拉菜单选项,当菜单由表格元素组成时(在网页上)
- python - 为什么 PyQt5 同时使用“cls”和“self”?
- python - anaconda 的多个版本(v4.0.0 和 v4.6.8)
- java - PopupMenu 无法正确显示
- android - 依赖注入和这个类是什么?