【问题标题】:Generate Two Arrays of Non-Duplicate Numbers生成两个非重复数字数组
【发布时间】:2015-06-14 12:32:47
【问题描述】:

我有以下代码,它根据一个比率生成两个不重复的整数数组。代码完美运行,但对于 4000 行文件,这需要一些时间。

//Train & Test numbers
int train = (int)(((double)Settings.Default.TrainingRatio / 100) * inputLines.Count());
int test = inputLines.Count() - train;

//Train & Test list
Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Count()).OrderBy(x => rnd.Next()).Take(train).ToList();
var testList = new List<int>();
for (int i = 1; i <= inputLines.Count(); i++)
{
    if (!trainList.Contains(i))
        testList.Add(i);
}

更糟糕的是,这就是我阅读这些行的方式:

foreach (var n in trainList)
{
    objDataintilizer.GenerateMasterLableFile(inputLines.Skip(n - 1).Take(1).First().ToString());
}

任何人都可以建议另一种可能具有更好性能的方法。

【问题讨论】:

  • inputLines是什么类型?
  • 它是一个包含行的列表
  • 你读的怎么样?
  • File.ReadLines(InputFile);
  • 啊……请把inputLines.Skip(n - 1).Take(1).First()改成简单的……inputLines[n - 1]。不知道为什么要绕道 1000 英里,但可以肯定的是,这无助于您的代码更快,甚至更易读。

标签: c# arrays random


【解决方案1】:

每次您的代码调用inputFiles.Count(),您实际上是在重新读取整个文件,因为File.ReadLines 正在使用延迟执行,而您并没有具体化它。由于无论如何您都需要内存中的整个列表,因此请改用 File.ReadAllLines,它返回一个 string[] 并具有一个 Length 属性,这是一个 O(1) 操作而不是 O(N)。

然后,不要为您的trainList 使用List&lt;int&gt;,而是使用HashSet&lt;int&gt;,这样使用Contains 查找会更快:

public static class EnumerableExtensions
{
    public static HashSet<T> ToHashSet(this IEnumerable<T> enumerable)
    {
        return new HashSet<T>(enumerable);
    }
}

Random rnd = new Random();
var trainList = Enumerable.Range(1, inputLines.Length)
                          .OrderBy(x => rnd.Next())
                          .Take(train)
                          .ToHashSet();

var testList = new List<int>();
for (int i = 1; i <= inputLines.Length; i++)
{
    if (!trainList.Contains(i))
        testList.Add(i);
}

【讨论】:

  • 我使用了您的部分解决方案,但我无法使用 ReadAllLines,因为我的文件很大,会导致 OutOfMemoryException。我有一个问题,你认为我可以加强阅读台词吗?
  • 如果文件很大,您可以使用ReadLines 处理文件的子集。您可以逐行迭代并以这种方式创建列表。
猜你喜欢
  • 2014-11-10
  • 2015-03-26
  • 2014-11-19
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多