C# TList和创建新的类(我自己的类的列表)正在更新TList

C# TList和创建新的类(我自己的类的列表)正在更新TList,c#,.net,list,tlist,C#,.net,List,Tlist,我有一个WizardInfo类,它将多个TLists作为属性,然后在用户通过向导时填充。在最后一个屏幕上,我查询TLists并将它们放入列表和私有字段中 然后,我从这些列表中创建DefaultItems列表。这是我自己的类,名称和Id是它的属性。 他是一个密码 public class DefaultItem { public int ID {get;set;} public string Name {get;set;} } private List<DefaultItem

我有一个WizardInfo类,它将多个TLists作为属性,然后在用户通过向导时填充。在最后一个屏幕上,我查询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;
    }
}
public类DefaultItem
{
公共int ID{get;set;}
公共字符串名称{get;set;}
} 
私有列表_defaultList=null;
_defaultList=新列表();
defaultValue=PopulateDefaultList(_asmgps,defaultList);
私有int填充默认列表(
列出asmgps,
参考列表(默认列表)
{
int isdefault=-1;
foreach(ASGMP中的ASGMP)
{
如果(按GMP检查)
{
如果(asgmp.IsDefault)
{
isdefault=asgmp.ID;
}
DefaultItem DefaultItem=新的DefaultItem();
defaultItem.ID=asgmp.ID;
defaultItem.Name=GetMPTName(asgmp.ID);
defaultList.Add(defaultItem);
}
}
返回默认值;
}
私有字符串GetMPTName(int-ID)
{
尝试
{
SGMP SGMP=DataRepository.SGMPProvider.GetByASGMPID(ID)
if(serviceGroupMailPresentation!=null)
{
MPT-MPT-DataRepository.MPTProvider.GetByMPTID(SGMP.MPTID);
if(mailPresentationType!=null)
{
返回mpt.Name;
}
}
返回字符串。空;
}
捕获(例外情况除外)
{
WindowsEventLog.Write(ex);
投掷;
}
}
我遇到的问题是,当我从defaultList中删除一个项目时,它会影响asgmp。
我找到了答案。当我得到mpt名称时,我从数据库中得到了asgmp,这是Codesmith做了一件奇怪的事情并连接列表和DefaultList的用法的地方。通过查询原始列表而不是进入数据库,它现在可以正常工作。

erm,而不是
PopulatedDefaultList
为什么不直接这样做

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
是从
对象
派生的,是一种
引用
类型。引用类型是按引用传递的,即当您传递列表时,您传递的是指向其在内存中位置的指针。因此,对复制的参照所做的任何更改也将反映在原始对象上

要制作副本,您可以更改如下内容:
defaultValue=PopulateDefaultList(\u asmgps,defaultList)

为此:

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


这将以
IEnumerable
的形式枚举集合,并以列表的形式返回。这将有效地创建一个副本。

我发现这是因为ntiers而不是使用数据库来获取我应该在列表中的T列表中使用的ID?在C#中?那是Delphi。你可以在这里使用
字典
,而不是创建这个
DefaultItem
类?这似乎也是多余的<代码>私有列表_defaultList=null_defaultList=新列表()您是否有可能确保发布的代码正确?您正在调用的
PopulateDefaultList
的重载与您显示的重载不匹配(前者需要7个参数,后者需要2个参数)。很抱歉,额外的parremeters没有任何问题。为什么是redundent该列表已过视图绑定到组合框,我将该列表返回到一个私有变量,我想在c#中知道的是为什么是Codesmith创建的TList,并通过从默认列表中删除and项而受到影响。感谢您的响应,我担心它仍然会影响TList。@user3437405,以何种方式,什么是
TList
List
?@user3437405,除非
GetMPTName
使用我的答案中的代码返回一个引用类型,否则对
asgmps
defaultList
的更改不能影响另一个。这是不可能的。如果您遇到此行为,您将不会使用此代码。No GetMptenum只是从另一个表的id获取枚举Complety TList是使用codesmith和Ntiers时创建的列表名称已更改,但默认列表由defaultitem组成,用户可以选择将其设为defaultYes,但defaultList不是TListAsgmp是通过从Tlist查询列表派生出来的,但是我创建了一个新的defaultList,它是ref,而不是Asgmps和newdefaultitem。原始Tlist和DefaultItem列表之间应该没有连接,但是当我从DefaultItem中删除对象时,它会影响列表和我用来创建列表的Tlists。这是列表的解决方案。很抱歉项目的解决方案是相同的(或多或少)。您可以为
DefaultItem
创建构造函数,它接受一个现有的默认项,并将数据深度复制到一个新实例中。但这正是我不希望列表与Tlist或列表有任何联系的地方,我只希望完全指定对象,但填充此对象的方式会导致Tlist和列表发生更改。下面是sequence I Integrate Wzard Info类,作为Tlists,我从这些Tlists获取数据以创建列表,然后使用列表绑定到组合框。我遇到的主要问题是,Tlist受到默认列表的影响,默认列表不应该有任何连接。如果它说确实解决了您的问题,您应该将此答案标记为已解决。