#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 ; }