#c# #list #select #extension-methods #immutability
#c# #Список #выберите #методы расширения #неизменяемость
Вопрос:
У меня есть неизменяемый список.
В приведенном ниже g.Select(…) я делаю .ToList(), который помещается в MemberIdList. Я не хочу создавать новый список с помощью ToList(), скорее я хочу добавить каждую строку r.Field в неизменяемый список внутри объекта unit.
Как я могу это сделать?
var groupedCollection = table.AsEnumerable()
.GroupBy(row => new
{
UType = row.Field<string>("UnitType"),
UZoom = row.Field<string>("UnitZoom"),
MZoom = row.Field<string>("MemberZoom"),
});
var unitCollection = groupedCollection
.Select(g => new Unit
{
UnitType = g.Key.UType,
UnitZoom = g.Key.UZoom,
MemberZoom = g.Key.MZoom,
MemberIdList = g.Select(r => r.Field<string>("TestId")).ToList(),
});
List<Unit> units = unitCollection.ToList();
public class Unit
{
public Unit()
{
MemberIdList = new List<String>();
}
public String UnitType { get; set; }
public String UnitZoom { get; set; }
public String MemberZoom { get; set; }
public int MemberOrder { get; set; }
public List<String> MemberIdList { get; private set; }
}
Комментарии:
1. В моем контексте MemberIdList.AddRange(g.Select(r => r.Field<string>(«TestID»))); не работает. Вводим MemberIdList. нет дополнительного диапазона.
2. @msfanboy тогда ты уверен, что это
List<T>
? Поскольку это определенно имеет дополнительный диапазон. Вам, конечно, нужно будет указать ему экземпляр, то есть Obj.MemberIdList.AddRange()3. Кстати;
List<T>
никогда не бывает неизменным. Свойство списка без установщика сильно отличается от неизменяемого списка.4. но у меня есть собственный установщик??
5. @msfanboy итак? это просто означает, что вы не можете изменить его на другой список. Я все еще могу вызвать yourList.Add(x) — список не является внутренне неизменяемым.
Ответ №1:
Почему бы просто не создать конструктор для Unit, который принимает данные для MemberIdList, например:
public Unit(IEnumerable<string> memberIdList)
{
MemberIdList = new List<string>(memberIdList);
}
и измените свой выбор на:
.Select(g => new Unit(g.Select(r => r.Field<string>("TestId")))
{
UnitType = g.Key.UType,
UnitZoom = g.Key.UZoom,
MemberZoom = g.Key.MZoom
});