Обновить свойство элементов списка без "l oop" и "if" - PullRequest
0 голосов
/ 19 марта 2020

Я обновляю свойство элементов list.

class Response
{
    public string Name { get; set; }
    public int Order { get; set; }
}

Здесь я хочу обновить Order переменной List<Response>. На данный момент я перебираю каждый элемент списка и обновляю его.

List<Response> data = FromDb();
foreach (var item in data)
{
    if(item.Name.Equals("A"))
    {
       item.Order=1;
    }
    if(item.Name.Equals("B"))
    {
       item.Order=2;
    }
    //Like this I have arround 20 conditions
}

Приведенный выше код работает нормально, но проблема в том, что Cognitive Complexity метода больше, чем разрешено.

Я попробовал что-то похожее ниже

data.FirstOrDefault(x => x..Equals("A")).Order = 1;
data.FirstOrDefault(x => x..Equals("B")).Order = 2;
//and more ...

В этом коде также null проверка не установлена, поэтому, если искомая строка отсутствует в списке, она снова прервется.

Если я добавлю null условие проверки, то снова complexity становится выше.

Так что здесь я хочу без каких-либо for loop или if, если я могу обновить Порядок список, используя linq / lamda или что-нибудь еще.

1 Ответ

3 голосов
/ 19 марта 2020

Я не знаю, как вы измеряете Cognitive Complexity и сколько из него разрешено выталкивать в другие функции, но что-то вроде этого делает порядок довольно декларативным?

[Fact]
public void TestIt()
{
    var data = FromDb().Select(SetOrder(
        ("A", 1),
        ("B", 2)
    ));
}

static Func<Response, Response> SetOrder(params (string Name, int Order)[] orders)
{
    var orderByKey = orders.ToDictionary(x => x.Name);

    return response =>
    {
        if (orderByKey.TryGetValue(response.Name, out var result))
            response.Order = result.Order;

        return response;
    };
}

Добавление в ответ на комментарий:

Чтобы иметь значение по умолчанию для несопоставленных имен, SetOrder можно изменить на это:

static Func<Response, Response> SetOrder(params (string Name, int Order)[] orders)
{
    var orderByKey = orders.ToDictionary(x => x.Name);

    return response =>
    {
        response.Order = 
            orderByKey.TryGetValue(response.Name, out var result)
                ? result.Order
                : int.MaxValue;

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