所以我有一个只有 2 个文本文件的文件夹,我正在读取它们并存储值。代码如下所示:
public static void UnionFiles()
{
var dinfo =
new DirectoryInfo(
@"http");
var files = dinfo.GetFiles("*.txt");
int i = 1;
System.Collections.Generic.IEnumerable<String> _eValA, _eValB;
foreach (var file in files)
{
if (i == 1)
{
_eValA = File.ReadLines(file.Name);
++i;
}
else
{
_eValB = File.ReadLines(file.Name);
i = 1;
}
}
IEnumerable<String> union = _eValA.Union(_eValB);
File.WriteAllLines(@"httpunion.txt", union.Cast<String>());
}
但是我收到此错误:Use of unassigned local variable '_eValB, _eValA'
我怎样才能过去。
谢谢。
第一次通过循环时,您将永远不会同时分配_evalA
和_evalB
。您需要同时分配给两者以避免该问题。
还有其他相关问题。例如,当没有正好两个文件时会发生什么情况?
由于正好有两个文件,因此不需要使用循环。如果避免循环,则可以轻松避免当前问题。例如:
var files = dinfo.GetFiles("*.txt");
System.Collections.Generic.IEnumerable<String> _eValA, _eValB;
// Should really assert that files.Count == 2
_evalA = File.ReadLines(files.First().Name);
_eValB = File.ReadLines(files.Last().Name);
IEnumerable<String> union = _eValA.Union(_eValB);
考虑一下你的代码可以采用的可能路径。_eValA
可能未初始化,或者_eValB
可能未初始化,因此会出现错误。由于编译器可以检测到这一点,因此它会给您一个编译错误。您需要确保它们设置为等于一个值(或 null,这让编译器知道您对它们负责,如此处所述,但请注意 null 在这种情况下不合适,因为对于 0 或 1 个文件,您会在使用它们之前在.Union
调用时获得ArgumentNullException
)。尝试:
var _eValA = new string[0];
var _eValB = new string[0];
foreach (var file in files)
{
if (i == 1)
{
_eValA = File.ReadLines(file.Name);
++i;
}
else
{
_eValB = File.ReadLines(file.Name);
i = 1;
}
}
这将确保它们在使用之前都已初始化。