我有一个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的用法。通过查询原始列表而不是去数据库,它现在可以正常工作。
答案 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