Инкапсуляция и использование LINQ logi c в функциях с точечной нотацией - PullRequest
2 голосов
/ 07 февраля 2020

Я старался изо всех сил объяснить в заголовке, однако я пытаюсь добиться того, чтобы операторы linq назывались псевдонимами и все еще использовали их в точечной нотации. Позвольте мне объяснить дальше.

ниже у нас есть список, к которому применен оператор linq:

private List<string> _matches;

var output = _matches.Where(x => x.EntityScore == 100).ToList();

Я согласен, что это просто читать. Тем не менее, я хотел бы sh, чтобы еще больше упростить его, особенно когда утверждения начинают расти. Это пример того, как linq становится длиннее, чем я забочусь:

private List<string> _matches;

var matchAddressList = _matches.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
                                                                           && x.StateProvinceDistrict.Equals(inputObject.State)
                                                                           && x.City.Equals(inputObject.City))).ToList();

Я пытаюсь создать псевдоним определенных групп LINQ, а затем вызвать этот linq как оператор точки

для пример:

var finalOutput = _matches.perfectMatches().addressMatches(inputObject).someOtherMatchCondition(inputObject)

Я думаю, что приведенная выше строка четкая и легко читаемая. Будущим разработчикам не обязательно заглядывать в логи c. Они могут прочитать бизнес доменное имя и понять, что оно делает. Я хочу избежать следующей строки, так как я считаю, что предыдущий код более чистый:

var finalOutput = someOtherMatchCondition(addressMatches(perfectMatches(_matches)));

предыдущая строка - это то, как я чувствую, вы бы go об этом использовали функции на базовом c уровне , Однако я изо всех сил пытаюсь найти способ создать псевдоним или инкапсулировать linq logi c в имя бизнес-домена , а затем использовать его в качестве оператора точки.

Я пробовал определения тела выражения:

public List<string> perfectMatches => _matches.Where(x => x.EntityScore == 100).ToList();

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

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Обновление: возможно, это тоже полезно:
Как добавить пользовательские методы для запросов LINQ (C#)


Это должен быть метод расширения для использовать точечную запись. Ты имеешь в виду что-то подобное? Это скорее псевдокод, чем работа. Возможно, вам придется поиграться с типами или попробовать какой-нибудь обобщенный c подход:

public class ProductionCode
{
    public void MyMain()
    {
        var myList = new List<EntityThingType>() { .... };

        var newList = myList.PerfectMatches().AddressMatches(myInputObject).ToList();
    }
}

public static class test
{
    public static IEnumerable<EntityThingType> PerfectMatches(this IEnumerable<EntityThingType> myList)
    {
        return myList.Where(x => x.EntityScore == 100);
    }


    public static IEnumerable<EntityThingType> AddressMatches(this IEnumerable<EntityThingType> myList, MyObjectType inputObject)
    {
        return myList.Where(x => x.EntityDetails.Addresses.Any(x => x.Street.Equals(inputObject.Address)
                                                                    && x.StateProvinceDistrict.Equals(inputObject.State)
                                                                    && x.City.Equals(inputObject.City)));
    }
}
2 голосов
/ 07 февраля 2020

Я думаю, что вы ищете Методы расширения . Вы можете иметь метод perfectMatches() в качестве метода расширения, который принимает IEnumerable<string> и возвращает его. Тогда вы можете связать их вместе.

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