【问题标题】:Order of the items in returned List from File.ReadAll() [closed]从 File.ReadAll() 返回的列表中的项目顺序 [关闭]
【发布时间】:2013-01-10 09:01:59
【问题描述】:

我不太确定这个问题的答案是什么,所以我希望能提供信息来帮助我更好地了解我在这里所拥有的东西。我的目标是将文本文件的内容读入列表,解析信息并删除孤立记录(文件中没有关联父记录/行的子记录/行),然后将其余行写回文件按顺序。

我使用以下方法

IList<String> lines  = File.ReadAll(Filepath);
IList<String> secondlines = lines.Copy();

foreach (String line in lines) 
{
    If Brecord 
        foreach String record in secondlines 
        {
             if  record is same as Brecord 
                   //No Parent record found for this Brecord before it
                    Delete record 
              else if record is Parent of Brecord 
                     exit loop
         }
}


File.WriteAll(secondlines , SecondPath)

我怎样才能确保每次发生这种情况时,文件的内容都按照它们在文件中出现的顺序进行处理?

【问题讨论】:

  • 您的代码当前写入行的顺序是否与读取时的顺序不同?
  • 这是什么烂摊子..?如果您要删除一条记录,您能否为您的内部 foreach 循环编写真正的代码,您怎么能期望列表的顺序相同..
  • 代码只是为了让您了解我目前在做什么。它只是伪代码。我真正想要的是关于是否保证我的文件内容按照它在文件中出现的顺序处理的信息。
  • 为什么我要对列表进行排序,而我只想确保它完全按照行在原始文件中出现的顺序出现?
  • @Kobojunkie 您是否确实看到了问题,此代码未按正确顺序打印您的记录?您的 cmets 让我想知道这个问题是否甚至是话题:stackoverflow.com/faq#dontask

标签: c# data-structures collections


【解决方案1】:

不是 100% 确定你的 if 语句在做什么,但为什么不使用 Linq

var lines = File.ReadAll(filepath)
                .Where(x=>( x.Something == "something else"));

File.WriteAll (lines, SecondPath)

或者在你的情况下更有可能

var lines = File.ReadAll(filePath).Distinct();

这应该保持将行读入列表的顺序。 此外,在 foreach 循环期间修改对象的内容时需要小心

【讨论】:

  • 为什么是 Distinct()?请问在这种情况下 Distinct() 能为我做什么?
【解决方案2】:

除非您在某处明确对它们进行排序或重新排序,否则您应该已经看到事情按照它们在文件中出现的顺序发生了。

  • 实现IList 的Framework 对象本质上是有序的
  • File.ReadAllLines 按出现的顺序返回文本文件中的行列表。
  • 使用foreach 枚举IList 会按顺序访问每个元素。
  • File.WriteAllLines 按顺序将字符串写入新文件。

由于您粘贴的代码实际上并不是您正在使用的代码,因此无法看出您是否正在做一些更微妙的事情,从而破坏了输入列表中元素的顺序。特别是,我对您的工作方式非常感兴趣

delete record

部分,因为您在枚举期间无法更改IList。我的怀疑是,无论您为生成第二个无重复列表所做的一切都是您的问题所在。

【讨论】:

  • 这是伪代码。如您所见,您不能按原样执行它。我知道在枚举时我无法从 Ilist 中删除它。我对这里处理我的文件内容的顺序更感兴趣。
  • 第二个无重复列表确实是第一个列表的副本。
【解决方案3】:

没有方法File.ReadAll

File.ReadAllLinesFile.ReadLines 方法已经以正确的顺序返回文件的行。所以你不需要做任何事情来保证这一点。

(它们之间的区别在于File.ReadAllLines一次将整个文件读入内存并给你一个包含完整文件内容的数组,而File.ReadLines是惰性的,只有当你foreach通过时才从文件中读取返回的对象。在最后一种情况下,您不必读取所有文件,并且整个文件不必一次在内存中,因为您“逐行”读取。)

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2020-09-25
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多