关于使用foreach循环将对象添加到C#列表的问题

3
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);
            }
        }
    }
}

我有两个文件1.txt2.txt,存储在string[] filename中。我正在将这些文件与数据库进行比较,并将值存储在lstgAFPFileInfo中。第一次它得到了文件名1.txt并添加到列表中。第二次它得到了值2.txt,但在将文件添加到列表后,它覆盖了值1.txt并再次添加了2.txt。现在列表的值如下:list[0]:2.txtlist[1]: 2.txt 有人能帮忙解决吗?

附带一提,if (lstgAFPFileInfo.Count() != 0) 是完全多余的。如果 lstgAFPFileInfo 不包含任何元素,你期望 foreach 将会怎样呢?崩溃?为什么会这样。对于一个空序列进行迭代根本不会产生任何作用。因此,这个条件只会增加代码噪声和不必要的缩进。 - Konrad Morawski
4个回答

7
这是因为你的循环一直在添加同一个对象,所以你的列表最终会有多个对同一个对象的引用。
请将projectfile = new ProjectFile()添加到循环的顶部以解决此问题。

2
您似乎每次都在projectfile中重复使用相同的对象。即使它已经被添加到列表中,您仍然在列表和变量中引用相同的对象,因此当您更新其属性时,在两个位置都会更新它。
您需要做的就是在foreach的开头加上一行,例如:
projectfile = new ProjectFileObject();

这将创建一个与已添加到列表中的实例完全分离的新实例。

需要注意的是,根据您在使用projectfile对象之前所做的操作,可能需要更复杂的解决方案,但这突出了您的基本问题。


1
因为您每次添加的是相同的实例,只是覆盖了其属性。您需要:
projectfile = new WhateverClassNameProjectFileIs();

在你最内层的foreach循环的顶部。

0

看起来你正在创建一个新的字符串数组,用于遍历文件名中的每个f。

foreach (string f in fileName)
{
lstgAFPFileInfo = GetFilesFromSourceServer(new string[] { f }, ServerpathID, SearchOption.TopDirectoryOnly).ToList();

因此,每次通过foreach迭代时,只会在数组中创建该时间的f值。尝试在循环外实例化数组,然后将您的值f添加到其中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接