TList и создание нового класса, который является моим собственным списком классов, обновляет Tlist
У меня есть класс WizardInfo, который представляет собой несколько списков TL в качестве свойств, которые затем заполняются, когда пользователь проходит через мастер на последнем экране, я запрашиваю списки Tlists и делаю их в списки и частные поля. Затем я создаю списки DefaultItems из этих списков. Это мой собственный класс, а также его имя и идентификатор в качестве его свойства. Он какой-то код
public class DefaultItem
{
public int ID {get;set;}
public string Name {get;set;}
}
private List<DefaultItem> _defaultList = null;
_defaultList = new List<DefaultItem>();
defaultValue = PopulateDefaultList(_asmgps, defaultList);
private int PopulateDefaultList(
List<ASGMP> asmgps,
ref List<DefaultItem> defaultList)
{
int isdefault = -1;
foreach (ASGMP asgmp in asgmps)
{
if (asgmp.IsChecked)
{
if (asgmp.IsDefault)
{
isdefault = asgmp.ID;
}
DefaultItem defaultItem = new DefaultItem();
defaultItem.ID = asgmp.ID;
defaultItem.Name = GetMPTName(asgmp.ID);
defaultList.Add(defaultItem);
}
}
return isdefault;
}
private string GetMPTName(int ID)
{
try
{
SGMP sgmp = DataRepository.SGMPProvider.GetByASGMPID(ID)
if (serviceGroupMailPresentation != null)
{
MPT mpt DataRepository.MPTProvider.GetByMPTID(SGMP.MPTID);
if (mailPresentationType != null)
{
return mpt.Name;
}
}
return string.Empty;
}
catch (Exception ex)
{
WindowsEventLog.Write(ex);
throw;
}
}
У меня проблема, когда я удаляю элемент из defaultList, он влияет на asgmp. Я нашел ответ. Когда я получаю имя mpt, я получаю asgmp из базы данных, именно здесь Codesmith делает странную вещь и связывает использование List и DefaultList. Запрашивая оригинальный список вместо перехода в базу данных, он теперь работает нормально.
3 ответа
Я обнаружил, что это связано с тем, что вместо использования базы данных для получения идентификатора, который я должен использовать в списке T в
Эм, вместо PopulateDefaultList
почему бы просто не сделать,
var defaultList = asgmps
.Where(asgmp => asgmp.IsChecked)
.Select(asgmp => new
{
IsDefault = asgmp.IsDefault,
Item = new DefaultItem
{
ID = asgmp.ID,
Name = GetMPTName(asgmp.ID)
}
}).ToList();
конечно, называя коллекцию defaultList
который содержит не-значения по умолчанию кажется противоречивым.
Это удаляется, потому что List<T>
происходит от object
и является Reference
тип. Типы ссылок передаются по ссылке, т.е. когда вы передаете свой список, вы передаете указатель на его местоположение в памяти. Таким образом, любые изменения, внесенные вами в скопированную ссылку, также будут отражены в исходном объекте.
Чтобы сделать копию, вы можете изменить это следующим образом:defaultValue = PopulateDefaultList(_asmgps, defaultList);
к этому:
defaultValue = PopulateDefaultList(_asmgps.ToList(), defaultList);
Это будет перечислять коллекцию как IEnumerable<T>
и возвращение в виде списка. Это эффективно создаст копию.