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> и возвращение в виде списка. Это эффективно создаст копию.

Другие вопросы по тегам