Функциональный способ создания и заполнения массивов в C # - PullRequest
1 голос
/ 17 октября 2019

Как я могу создать и заполнить массив функциональным способом, а не следующим императивным способом?

Код императива

IList<Customer> customers = new List<Customer>();

// my input data is array of strings

string[] ids = {"4", "6"};
string[] names = {"John Doe", "Jane Doe"};

for (var i = 0; i<ids.Length; i++) 
{
    customers.Add(new Customer
    { 
         Id = Int32.Parse(ids[i]),
         Name = names[i],
    });
}

Класс клиента

public class Customer
{
    public int Id { get; set; }

    public string Name { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Как то так?

customers = ids.Zip(names, (id, name) => new Customer { Id = Int32.Parse(id), Name = name }).ToList();
1 голос
/ 17 октября 2019

Если под functional вы подразумеваете без циклов, вы можете использовать LINQ Zip для объединения значений и получения IEnmerable<Customer>:

var customers=ids.Zip(names,(id,name)=> new Customer
                     { 
                         Id = Int32.Parse(ids[i]);
                         Name = names[i];
                     })
                 .ToArray();
                 //Or .ToList(); if a List<T> is preferable

Я говорю if, потому что для создания массива все еще требуетсявыделение массива и его изменение. На самом деле это больше дороже, чем создание массива заранее, потому что ToArray() не знает, насколько велик массив для создания, поэтому может потребоваться перераспределить его внутренние буферы.

Более функциональным подходом было бы использование IEnumerable<Customer>, произведенного Zip. Эта последовательность объектов customer может использоваться любым другим оператором LINQ или пользовательскими методами, которые ожидают IEnumerable<T>.

. Более производительная версия создаст массив заранее и скопирует значения из IEnumerable, созданного zip:

var customers=new Customer[ids.Length];

var values=ids.Zip(names,(id,name)=> new Customer
                                     { 
                                         Id = Int32.Parse(ids[i]);
                                         Name = names[i];
                                     });
var i=0;
foreach(var values)
{
    customers[i++]=v;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...