изменение значений элементов после группировки с помощью linq

#c# #linq

#c# #linq

Вопрос:

это трудно объяснить, но я стараюсь.

Я выполнил группировку linq.

var grouping = aList.GroupBy(x => new { x.Width, x.Height, x.Quantity});

Допустим, у меня теперь есть 3 группы в группировке. В группе 1 есть 1 элемент, в группе 2 — 5 элементов, а в группе 3 — 9 элементов. Все элементы имеют поле «стек». Что я хочу сделать сейчас, так это установить число в поле стека каждого элемента на основе группы.

Все элементы в группе 1 должны иметь одинаковый номер «стека», скажем, «1», все элементы в группе 2 должны иметь одинаковый номер «стека», возможно, «2», и все элементы в группе 3 должны иметь одинаковый номер «стека». Итак, один номер «стека» на группу.

Как это сделать?

Ответ №1:

Linq является запросом и не предназначен для изменения существующего объекта. Итак, если вы хотите изменить существующие без создания нового, используйте приведенный ниже код

     class Program
    {
        static void Main(string[] args)
        {

            List<MyList> aList = new List<MyList>() {
                new MyList() { Width = 1, Height = 2, Quantity = 3},
                new MyList() { Width = 1, Height = 2, Quantity = 3},
                new MyList() { Width = 1, Height = 2, Quantity = 3},
                new MyList() { Width = 2, Height = 2, Quantity = 3},
                new MyList() { Width = 2, Height = 2, Quantity = 3},
                new MyList() { Width = 3, Height = 2, Quantity = 3},
                new MyList() { Width = 3, Height = 2, Quantity = 3},
                new MyList() { Width = 3, Height = 2, Quantity = 3},
                new MyList() { Width = 3, Height = 2, Quantity = 3}
            };

            var grouping = aList.GroupBy(x => new { x.Width, x.Height, x.Quantity });

            int number = 0;
            foreach (var group in grouping)
            {
                foreach (MyList myList in group)
                {
                    myList.StackNumber = number;
                }
                number  ;
            }

        }

    }
    public class MyList
    {
        public int Width { get; set; }
        public int Height { get; set; }
        public int Quantity { get; set; }
        public int StackNumber { get; set; }
    }
  

Комментарии:

1. Вау, спасибо за ваши усилия, но я прокомментировал то же самое решение «double foreach» в первом ответе пару минут назад. Большое вам спасибо.

2. Я думаю, вы должны были инициализировать number 1 или увеличивать перед назначением.

3. @NetMage: имеет ли значение, что номера стеков начинаются с нуля или единицы?

4. @jdweng, по-видимому, для операции, которую он сделал: All items in group 1 should have the same "stack" number lets say "1"

5. @NetMage : не является обязательным требованием. ОП сказал «допустим».

Ответ №2:

Select имеет другую перегрузку, которая передает номер индекса делегату, вы могли бы это использовать.

 var grouping = aList
    .GroupBy(x => new { x.Width, x.Height, x.Quantity});
    .Select( (x,y) => new { Item = x, Stack = y } );
  

Комментарии:

1. спасибо за ваш ответ, но у меня уже было решение, но я забыл выполнить итерацию в правой строке. Я сделал это так foreach (переменная группа в группировке) { foreach (переменная строка в группе) { строка. StackNr = stackNr; Все стеки. Добавить (строка); } stackNr ; }