所以我有一个只有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(@"\http\union.txt", union.Cast<String>());
}
但是我收到了这个错误:Use of unassigned local variable '_eValB, _eValA'
我怎样才能超越它。
感谢。
答案 0 :(得分:2)
第一次循环播放时,您永远不会同时分配_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);
答案 1 :(得分:0)
考虑代码可能采用的路径。可能无法初始化_eValA
,或者_eValB
可能未初始化,因此您会收到错误。由于编译器可以检测到这一点,它会给你一个编译错误。你需要确保它们被设置为等于一个值(或者为null,这让编译器知道你对它们负责,正如here所解释的那样,但是注意null不适合于这种情况是因为在使用它们之前,您在ArgumentNullException
电话中获得了.Union
0或1个文件。尝试:
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;
}
}
这将确保它们在被使用之前都被初始化。