C# Преобразование произвольно вложенного списка с помощью лямбда-выражения - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сделать некоторые преобразования в списках разных классов. Например, есть класс A и класс B.

class A
{
    private int Data;
    public A(int InputData)
    {
        this.Data = InputData;
    }
    public int GetData()
    {
        return this.Data;
    }
    public B ToB()
    {
        return new B(this);
    }
}

class B
{
    private double Data;
    public B(A ObjectA)
    {
        this.Data = Math.Cos(ObjectA.GetData());        //  For example
    }
    public double GetData()
    {
        return this.Data;
    }
}

Тогда ListB1 является результатом преобразования из ListA1.

List<A> ListA1 = new List<A>() { new A(0), new A(1), new A(2) };
List<B> ListB1 = new List<B>();
foreach (var EachItem in ListA1)
{
    ListB1.Add(EachItem.ToB());
}

Мне интересно, есть ли способ использовать лямбда-выражение для выполнения этого примера? Может быть, что-то вроде List<B> ListB1 = ListA1.ConvertAll(ObjectA => { ObjectA.ToB(); }); Однако кажется, что входной параметр метода ConvertAll разработан как объект Converter, а не лямбда-выражение. Более того, есть ли простой способ справиться с произвольно вложенными списками, такими как следующий ListA2? Я знаю, что ListB2 может быть сгенерирован вложенным foreach l oop, но я с нетерпением жду возможности найти такой способ, как List<List<B>> ListB2 = ListA2.ConvertAll(ObjectA => { ObjectA.ToB(); });. Затем ту же структуру можно применить к произвольно вложенному списку.

List<List<A>> ListA2 = new List<List<A>>();
ListA2.Add(ListA1);
ListA2.Add(ListA1);
List<List<B>> ListB2 = new List<List<B>>();
foreach (var EachItem1 in ListA2)
{
    List<B> temp = new List<B>();
    foreach (var EachItem2 in EachItem1)
    {
        temp.Add(EachItem2.ToB());
    }
    ListB2.Add(temp);
}

Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вы можете использовать Linq Select для перевода каждого элемента;

List<B> ListB1 = ListA1.Select(a => a.ToB()).ToList();
List<List<B>> ListB2 = ListA2.Select(a2 => a2.Select(a => a.ToB()).ToList()).ToList();
0 голосов
/ 06 августа 2020

Вы можете сделать что-то вроде

ListA2.ForEach(x => x.ToB()).ToList();

Таким образом, теперь у вас есть список B

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