生成两个非重复数组

时间:2015-06-14 12:32:48

标签: c# arrays random

我有以下代码,它根据比率生成两个非重复的整数数组。代码工作正常,但对于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());
}

任何人都可以采用另一种可以提高性能的方式。

1 个答案:

答案 0 :(得分:3)

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

然后,不要使用List<int>代替trainList,而是使用HashSet<int>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);
}