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

时间:2014-02-26 13:52:37

标签: c#

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.txt文件名中有两个文件2.txtstring[]。我将这些文件与db进行比较,并将值转换为lstgAFPFileInfo。第一次获得文件名1.txt并添加到列表中。第二次获得值2.txt但是在将文件添加到列表后,它将覆盖值1.txt并再次添加2.txt。现在,列表值与此list[0]:2.txtlist[1]: 2.txt类似 任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:7)

这是因为你的循环不断地反复添加相同的对象,所以你的列表最终会有多个对同一对象的引用。

Illustration

projectfile = new ProjectFile()添加到循环顶部以解决此问题。

答案 1 :(得分:2)

您似乎每次都在projectfile重复使用同一个对象。即使它已被添加到列表中,您也会在列表和变量中引用相同的对象,因此当您更新其属性时,您将在两个位置更新它。

你需要的只是在你的foreach开头说一句话:

projectfile = new ProjectFileObject();

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

应该注意的是,根据您对projectfile对象的操作,可能需要更复杂的解决方案,但这突出了您的基本问题。

答案 2 :(得分:1)

因为您每次都要添加相同的实例,只需覆盖其属性即可。你需要

projectfile = new WhateverClassNameProjectFileIs();

位于最内层foreach循环的顶部。

答案 3 :(得分:0)

看起来你正在创建一个新的字符串数组foreach f in filename。

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

因此,通过foreach的每次迭代,只在该数组中创建f的值。尝试在循环外部实例化数组,然后在内部添加值。