TList和创建我自己的类列表的新类正在更新Tlist

时间:2014-03-19 12:21:57

标签: c# .net list tlist

我有一个WizardInfo类,它作为多个TList作为属性,然后在用户浏览最后一个屏幕上的向导时填充,我查询Tlists并将它们分为列表和私有字段 然后,我从这些列表中创建DefaultItems列表。这是我自己的类,名称和Id作为其属性。 他是一些代码

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 个答案:

答案 0 :(得分:0)

嗯,而不是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似乎是反直觉的。

答案 1 :(得分:0)

它被移除,因为List<T>来自object,并且是Reference类型。引用类型通过引用传递,即当您传递列表时,您将指针传递到其在内存中的位置。因此,您对复制的引用所做的任何更改也将反映在原始对象上。

为了制作副本,您可以将其更改为: defaultValue = PopulateDefaultList(_asmgps, defaultList);

到此:

defaultValue = PopulateDefaultList(_asmgps.ToList(), defaultList);

这会将集合枚举为IEnumerable<T>,并将其作为列表返回。这将有效地创建一个副本。

答案 2 :(得分:0)

我发现这是因为ntiers而不是使用数据库来获取我应该在T列表中使用的ID