Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成两个非重复数字数组_C#_Arrays_Random - Fatal编程技术网

C# 生成两个非重复数字数组

C# 生成两个非重复数字数组,c#,arrays,random,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

我有下面的代码,它根据比率生成两个非重复的整数数组。这些代码工作得很好,但对于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);
}

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

每次代码调用
inputFiles.Count()
,您都在有效地重新读取整个文件,因为
file.ReadLines
使用延迟执行,而您并没有具体化它。由于您仍然需要在内存中保存整个列表,请改用
File.ReadAllLines
,它返回
string[]
,并具有
Length
属性,该属性是一个O(1)操作,而不是O(N)

然后,不要对
列车列表使用
列表
,而是使用
哈希集
,使用
包含
可以更快地查找:

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);
}
公共静态类EnumerableExtensions
{
公共静态HashSet到HashSet(此IEnumerable可枚举)
{
返回新的哈希集(可枚举);
}
}
随机rnd=新随机();
var trainList=可枚举的范围(1,inputLines.Length)
.OrderBy(x=>rnd.Next())
.乘(火车)
.ToHashSet();
var testList=新列表();

对于(int i=1;i什么类型的
inputLines
?它是一个包含行的列表显示您正在阅读这些行吗?File.ReadLines(InputFile);ahhh…对于其中一个,请更改
inputLines.Skip(n-1)。将(1).First()
简单地说成….
inputLines[n-1]
。不知道为什么要绕行1000英里,但有一点是肯定的,这无助于提高代码的速度,甚至更具可读性。我使用了您的部分解决方案,但无法使用ReadAllLines,因为我的文件太大,会导致OutOfMemoryException。我有一个疑问,您认为我可以提高代码的可读性吗?如果文件是huge,您可以使用
ReadLines
处理文件的子集。您可以在运行过程中逐行迭代,并以这种方式创建列表。
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);
}