0

我有一个 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;
    }
}

我遇到的问题是,当我从 defaultList 中删除一个项目时,它会影响 asgmp。 我找到了答案。当我得到 mpt 名称时,我从数据库中得到 asgmp,这是 Codesmith 做一件奇怪的事情并将 List 和 DefaultList 的用法连接起来的地方。通过查询原始列表而不是转到数据库,它现在可以正常工作。

4

3 回答 3

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包含非默认值的集合似乎违反直觉。

于 2014-03-20T11:08:18.523 回答
0

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

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

对此:

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

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

于 2014-03-20T11:08:57.557 回答
0

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

于 2014-07-26T18:11:20.160 回答