[英]regarding C# adding objects to list using foreach loop
foreach (string f in fileName)
{
if (list.Where(p => p.FileName.Trim().Equals(f.Trim(), StringComparison.OrdinalIgnoreCase)).Count() == 0)
{
ServerpathID = GetSourceServerPath(projectID, out ServerPath);
DellDirectory dir = new DellDirectory(ServerPath);
lstgAFPFileInfo = GetFilesFromSourceServer(new string[] { f }, ServerpathID, SearchOption.TopDirectoryOnly).ToList();
if (lstgAFPFileInfo.Count() != 0)
{
foreach (Service.GAFPFileInfo lstg in lstgAFPFileInfo)
{
projectfile.Checksum = string.Empty;
projectfile.IsAutoDeleted = (autoDelete == true) ? true : false;
projectfile.Size = lstgAFPFileInfo[0].Size;
projectfile.IsArchived = false;
projectfile.ProjectFileId = 0;
projectfile.Language.LanguageId = 1;
projectfile.LastModifyDate = lstgAFPFileInfo[0].LastModified;
projectfile.ProjectPartLink = projectPartLink;
projectfile.FileName = f;
list.Add(projectfile);
}
}
}
}
我在string[]
filename中有两个文件1.txt
和2.txt
。 我将这些文件与db进行比较,并将值转换为lstgAFPFileInfo
。 它第一次获得文件名1.txt
并添加到列表中。 第二次获得值2.txt
但是在将文件添加到列表后,它将覆盖值1.txt
并再次添加2.txt
。 现在列表值就像这个list[0]:2.txt
和list[1]: 2.txt
任何人都可以帮忙吗?
这是因为您的循环不断地反复添加相同的对象,因此您的列表最终会对同一对象进行多次引用。
将projectfile = new ProjectFile()
添加到循环的顶部以解决此问题。
您似乎每次都在projectfile
重用相同的对象。 即使将其添加到列表中,您也会在列表和变量中引用相同的对象,因此在更新其属性时,您将在两个位置更新它。
你需要的只是在你的foreach开头说一句话:
projectfile = new ProjectFileObject();
这将创建一个与已添加到列表中的实例完全分离的新实例。
应该注意的是,在可能需要更复杂的解决方案之前,取决于您对projectfile对象所做的操作,但这突出了您的基本问题。
假设您每次都添加相同的实例,只是覆盖其属性。 你需要
projectfile = new WhateverClassNameProjectFileIs();
在最里面的foreach
循环的顶部。
看起来你正在创建一个新的字符串数组foreach f in filename。
foreach (string f in fileName)
{
lstgAFPFileInfo = GetFilesFromSourceServer(new string[] { f }, ServerpathID, SearchOption.TopDirectoryOnly).ToList();
因此,通过foreach的每次迭代,只在该数组中创建f的值。 尝试在循环外部实例化数组,然后在内部添加值f。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.