首页 > 解决方案 > 如何将搜索参数传递给将搜索 ac# 集合的函数

问题描述

假设我有一个表单集合:

List<Member> myMembers= new List<Member>() 
{ 
    new Member(){ID=1,FirstName="John",LastName="Doe"}, 
    new Member(){ID=3,FirstName="Allan",LastName="Jones"}, 
    new Member(){ID=2,FirstName="Martin",LastName="Moe"}, 
    new Member(){ID=4,FirstName="Ludwig",LastName="Issac"} 
};

我可以使用以下方法通过FirstName对该列表进行排序:

myMembers.Sort((x, y) => x.FirstName.CompareTo(y.FirstName)); 

我想在函数内部执行此操作,以便可以传递所需的搜索参数。就像是:

public void sortCollection( parameter SearchTerm, List<Member> myCollection )
{
    myCollection ((x, y) => x.SearchTerm.CompareTo(y.FirstName)); 
}

显然在这里,我不能以这种方式传递所需的搜索字段,但是可以按照我的要求做吗?

标签: c#listlinqsortingcollections

解决方案


您可以为此创建一个通用扩展方法并将Func<T, TResult>委托传递给它,它用作内置Sort方法的键选择器

public static void SortExt<T, TValue>(this List<T> collection, Func<T, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    collection.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
}

请记住,您应该比较比较对象的相同字段。

使用示例

myMembers.SortExt(member => member.FirstName);

如果只想比较myMembers集合,可以简化声明

public static void SortExt<TValue>(this List<Member> members, Func<Member, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    members.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
}

另一种选择是引入一个Comparison<T>委托实例来存储字段比较的逻辑并将其传递给Sort方法。您可以在此处指定所需的任何自定义比较

Comparison<Member> comparison = (x, y) => x.FirstName.CompareTo(y.FirstName);
myMembers.Sort(comparison);

推荐阅读