edycja co n-tego elementu w liście list

0

Mam prostą strukturę:

    public class Basket
    {
        public string Temp { get; set; }
        public List<Item> Items {get;set;}
    }

    public class Item
    {
        public string Name { get; set; }
        public string Surname { get; set; }
    }

Mam listę koszyków. Każdy koszyk zawiera listę Item-ów. Chciałbym dla co drugiego Item-a, zmienić wartość pola Name.

Obecny kod:

foreach (var basket in Baskets)
            {
                var temp = basket.Items.Where((v, i) => i % 2 == 0).ToArray();
                foreach (var t in temp)
                {
                    t.Name += " ++++CHANGED!"
                }
            }

Ktoś miałby pomysł jak ładniej to napisać? :)

1

Foreach jest ładny, ale jak chcesz, to może po prostu zwykły for?

for (int i = 0; i < basket.Items.Count(); i += 2)
{
    basket.Items.ElementAt(i).Name = "changed";
}

#edit nieistotne

Performance:

public class Basket
{
    public string Temp { get; set; }
    public List<Item> Items = new List<Item>();
}
public class Item
{
    public string Name { get; set; }
    public string Surname { get; set; }
}
class Program
{
    const int amountOfItems = 1000000;

    public static void testFor()
    {
        Basket basket = new Basket();

        for (int i = 0; i < amountOfItems; i++)
        {
            basket.Items.Add(new Item { Name = "1", Surname = "test" });
        }

        Stopwatch stoper = new Stopwatch();
        stoper.Start();
        for (int i = 0; i < basket.Items.Count(); i += 2)
        {
            basket.Items.ElementAt(i).Name = "changed";
        }
        stoper.Stop();

        Console.WriteLine(stoper.ElapsedMilliseconds + "ms (for loop)");
    }

    public static void testForeach()
    {
        Basket basket = new Basket();

        for (int i = 0; i < amountOfItems; i++)
        {
            basket.Items.Add(new Item { Name = "1", Surname = "test" });
        }

        Stopwatch stoper = new Stopwatch();
        stoper.Start();
        var temp = basket.Items.Where((v, i) => i % 2 == 0).ToArray();
        foreach (var t in temp)
        {
                t.Name += " ++++CHANGED!";
        }
        stoper.Stop();

        Console.WriteLine(stoper.ElapsedMilliseconds + "ms (foreach)");     
    }
    public static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            testFor();
            testForeach();
            Console.WriteLine("_______________");
        }
        Console.ReadKey();
    }
}
2

@up, to niezły performance test, jak te testy robią co innego :D

1
IEnumerable<Item> result = baskets.SelectMany(basket => basket.Items).Where((item, index) => index % 2 == 0);

foreach (var item in result)
{
    item.Name = "changed";
}

Powyższy kod pobiera wszystkie parzyste itemy z każdego koszyka, no i potem w foreach modyfikuje nazwę

W sumie to co drugi element tak jak napisałeś, bo określenie czy coś jest parzyste czy nie tutaj nie pasuje

0

Dzięki Panowie,

wyszło że to jest najszybsze z powyższych:

       foreach (var basket in baskets)
            {
                for (int i = 0; i < basket.Items.Count(); i += 2)
                {
                    basket.Items.ElementAt(i).Name = "changed";
                }
            }
            

1 użytkowników online, w tym zalogowanych: 0, gości: 1