Как я могу использовать лямбда-выражение для вычисления функции в C# с переменными из нескольких узлов в LinkedList <object>? I - PullRequest
0 голосов
/ 07 января 2020
static void Main(string[] args)
{
    LinkedList<Day> Days = new LinkedList<Day>();

    Day day1 = new Day() { sunUp = 800, sunDown = 1800 };
    Day day2 = new Day() { sunUp = 755, sunDown = 1805 };
    Day day3 = new Day() { sunUp = 750, sunDown = 1810 };
    Day day4 = new Day() { sunUp = 745, sunDown = 1815 };
    Day day5 = new Day() { sunUp = 740, sunDown = 1820 };

    Days.AddLast(day1);
    Days.AddLast(day2);
    Days.AddLast(day3);
    Days.AddLast(day4);
    Days.AddLast(day5);
    Console.WriteLine("There is an average of {0} minutes of night over the past {1} days.", Calculator(Days), Days.Count);
}
public static int ToMinutes(int time)
{
    return time / 100 * 60 + time - time / 100 * 100;
}
class Day
{
    public int sunUp;
    public int sunDown;
}

public static int Calculator(LinkedList<Day> Days)
{
    var current = Days.First;
    int nightDuration = 0;
    int count = 0; 
    while (current.Next != null)
    {
        nightDuration += ToMinutes(current.Value.sunDown) - ToMinutes(current.Next.Value.sunUp);
        current = current.Next;
        count++;
    }
    return nightDuration/count;

}

Требование: День должен быть сохранен в LinkedList.

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

Спасибо за помощь!

Приветствия, Кайл

Ответы [ 2 ]

1 голос
/ 07 января 2020

Глядя на ваш пример, я вижу, что вы пытаетесь сказать. Итак, вы хотите использовать те же логики c, что и в вашем методе Calculator, но с использованием лямбда-выражения. Самый простой способ сделать это - использовать Language Integrated Query (LINQ).

Итак, разбивая ваш метод Calculator (), мы видим, что он на самом деле содержит 2 элемента.

  1. Суммируйте каждое значение после объединения num1 с num2 в списке
  2. Разделите конечный результат на общее количество в списке.

Самый простой способ сделать это - использовать Enumerable.Sum, а затем разделить это значение на количество в списке. Например:

Pairs.Sum(pair => pair.num1 + pair.num2) / Pairs.Count

Result: 6

Вот пример кода

Enumerable.Sum - это метод расширения из пространства имен System.Linq. Он возвращает сумму числовых c значений в коллекции.

Хотя лямбда-выражения потрясающие, имейте в виду, что читаемость также очень важна. Это в основном анонимные функции, которые, если logi c станет сложным, будут трудны для понимания другими разработчиками / членами команды.

Надеюсь, это поможет. Удачи!


РЕДАКТИРОВАТЬ

Так что, если я правильно понимаю, вам будет трудно использовать лямбда-выражения с вложенными методами. Как, например, ваш метод Calculator () использует другой метод ToMinutes.

Используя код из моего первого примера, мы все еще можем использовать логи c. Самая важная часть, которую мы должны изменить - это логика c в пределах суммы. Например,

Days.Sum(day => ToMinutes(day.sunDown) - ToMinutes(day.sunUp )) / totalDays;

Это только один из способов сделать это. Другой вариант - создать ExtensionMethod. Например,

namespace ExtensionMethods
{
    public static class IntExtensions
     {
        public static int ToMinutes(this int time)
        {
            return time / 100 * 60 + time - time / 100 * 100;
        }
    }
}

Над классом, который вы хотите использовать метод расширения, просто включите его, написав

using ExtensionMethods;

в верхней части документа.

Это даст другой вариант для всех ваших целых чисел, чтобы проанализировать значение на другое значение. В нашем случае до минут.

int totalDays = Days.Count;
int averageMinutes = Days.Sum(day => day.sunDown.ToMinutes() - day.sunUp.ToMinutes()) / totalDays;
Console.WriteLine("There is an average of {0} minutes of night over the past {1} days.", averageMinutes, totalDays);

Но опять. Это один из способов сделать это. Я бы порекомендовал вам прочитать и прочитать C# в глубину Джона Скита, а также погрузиться в принципы чистого кода. См. пример кода для получения более подробной информации.

Удачи!

1 голос
/ 07 января 2020

В вашем псевдокоде с использованием калькулятора (для добавления в данном случае) есть несколько неправильных вещей

У вас есть класс с двумя целыми числами. Я считаю, что ваша идея состоит в том, чтобы сложить два числа вместе с двумя числами из каждого другого узла связанного списка. Но вы добавляете только первое число из Pair и добавляете его ко второму номеру следующего узла ... не думайте, что это будет работать.

array = current.value.int1 + current.Next.value.int2;

должно быть

array = current.value.int1 + current.value.int2;

Рабочий пример

    public static int Calculator(LinkedList<Pair> Pairs)
    {
        var current = Pairs.First;
        int sum = 0;
        while (current != null)
        {
            sum += current.Value.num1 + current.Value.num2;
            current = current.Next;
        }
        return sum;
    }

Запустил это в основном,

    LinkedList<Pair> Pairs = new LinkedList<Pair>();
    Pair pair = new Pair() { num1 = 1, num2 = 5 };
    Pairs.AddFirst(pair);
    Pairs.AddLast(pair);
    Pairs.AddLast(pair);
    Console.WriteLine( Calculator(Pairs));

Выход

18

Лямбда-выражение , которое вы можете использовать для сложения всех связанных списков, можно суммировать как

Console.WriteLine(Pairs.Sum(x => x.num1 + x.num2));

Вывод

18

Надеюсь, это поможет

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