Как передать параметр поиска в функцию, которая будет искать коллекцию c# - PullRequest
0 голосов
/ 17 февраля 2020

Предположим, у меня есть коллекция вида:

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

Очевидно, здесь я не могу перейти в нужное поле поиска таким образом, но возможно ли сделать то, что я спрашиваю?

Ответы [ 4 ]

1 голос
/ 17 февраля 2020

Для этого можно создать обобщенный метод расширения c и передать ему делегат 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> экземпляр делегата для хранения логики c сравнения полей и передачи его в метод Sort. Здесь вы можете указать любое пользовательское сравнение, которое вы хотите

Comparison<Member> comparison = (x, y) => x.FirstName.CompareTo(y.FirstName);
myMembers.Sort(comparison);
0 голосов
/ 17 февраля 2020

Вместо того, чтобы писать еще одну обертку для метода Linq .OrderBy() или .Sort() и вызывать ее там, где вы хотите отсортировать, используйте метод Linq OrderBy() или .Sort()

Используйте Sort() как

//If you want to sort collection by Id then
myMembers.Sort(x => x.Id); 

//If you want to sort collection by FirstName then
myMembers.Sort(x => x.FirstName);

...

Чтобы выбрать между OrderBy () / Sort (), читайте ниже тему вопросов и ответов

C# Сравнение Sort и OrderBy

0 голосов
/ 17 февраля 2020

Почему бы просто не использовать встроенную функцию?

myMembers.OrderBy(m => m.FirstName)

Если вы действительно хотите, вы можете написать свою оболочку для этой функции, но вызов будет выглядеть более или менее идентично и будет выглядеть как заново изобретать колесо.

что-то вроде этого метода расширения:

public static IEnumerable<T> OrderByWrapper<T, TKey>(this IEnumerable<T> source, Func<T,TKey> keySelector)
{
    return source.OrderBy(keySelector);
}

вы бы назвали его с помощью:

myMembers.OrderByWrapper(m => m.FirstName)
0 голосов
/ 17 февраля 2020

Демонстрация на do tnet fiddle

Мне кажется, что вы можете использовать Fun c <>, чтобы иметь возможность динамически c упорядочивать по.

var result = sortCollection(p => p.ID, myMembers);

public static IEnumerable<Member> sortCollection(Func<Member, object> keySelector, List<Member> myCollection)
{
    return myCollection.OrderBy(keySelector);
}

Прочитайте следующий пост, чтобы лучше понять

Dynami c Сортировать по в Linq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...