LINQ Добавить строку в каждые 5 позиций списка

243
31 января 2018, 11:47

Помогите переписать код с помощью Linq

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
    public int LastName { get; set; }
}
var UserList = new List<User>();
var NewUserList = new List<User>();
int i = 0;
foreach(var user in UserList)
{
    if (i++ % 5 == 0)
    {
        NewUserList.Add(new User() { Id = 0,Name = "Иванов" });
    }
    NewUserList.Add(user);
}
Answer 1

Ну например так:

var NewUserList = UserList.SelectMany(
    (u, idx) => idx % 5 == 0 ? new[] { new User() { Id = 0, Name = "Иванов" }, u } :
                               new[] { u }).ToList();

Ну или можно, например, подключить из nuget MoreLinq и написать более изящно:

var NewUserList =
    UserList.Batch(5)
            .SelectMany(part => part.Prepend(new User() { Id = 0, Name = "Иванов" }))
            .ToList();
Answer 2

Не знаю зачем вам это надо - выглядит сомнительно, ну да ладно. Отвечаю:

Не сделать в LINQ'е такого, по крайней мере так чтоб не сломать там нафиг мозг - и потом никто в этом без бутылки не разберется, так что сделаем немного иначе. (P.S. Ну как я и говорил - сделать можно как в ответе VladD - но читается это весьма худо, либо требует внешних зависимостей, что зачастую бывает излишним).

Вынесем лучше в метод-расширение с глаз долой (особенно если это будет вызываться больше одного раза) заодно сделаем функцию "ленивой", чтоб вообще по феншую:

public static class UserExtension
{
   public static IEnumerable<User> InsertIvan5(this IEnumerable<User> list)
   {
        var i = 0;
        foreach (var user in list)
        {
            if (i % 5 == 0)
            {
                yield return new User() { Id = 0, Name = "Иванов" };
            }
            yield return user;
            i++; // Так читабельнее нежели инкремировать ее внутри условия. 
                 // К черту эту сишную магию.
        }
    }
}

В таком случае в коде будет вызываться так:

var NewUserList = UserList.InsertIvan5(); 

Опять же имя функции лучше как-нибудь более вразумительное дать - ну тут уж вы сами. Технически - очень похоже на LINQ так же можно заключать в цепочки со стандартными LINQ функциями и даже можно цепочку из этих самых функций нагородить. В LINQ тоже многое на методах-расширениях держится, а внутри зачастую никакой магии - все те же циклы и коллекции.

Answer 3
var userList = new List<User>();
// ... заполняем юзеров
int i = 0;
var newUserList = new List<User>();
userList.ForEach(x => 
{
    if((i++ % 5)==0) {
         newUserList.Add(new User() { Id = 0,Name = "Иванов" });    
    }
    newUserList.Add(x); 
});
READ ALSO
Обрезать окно другого приложения

Обрезать окно другого приложения

Есть звонилка, внизу у нее постоянно реклама висит, что раздражаетВозникла идея не блочить сервер рекламы, а просто обрезать снизу, либо серый...

227
Как преобразовать &ldquo;\\n&rdquo;, &ldquo;\\t&rdquo; в &ldquo;\n&rdquo;, &ldquo;\t&rdquo;

Как преобразовать “\\n”, “\\t” в “\n”, “\t”

Я беру из текстового файла содержимое вида:

211