我正在尝试将一起编译的字符串列表与主列表进行比较,然后将它们打印到文本文件中。我遇到的问题是可打印列表仍然是空的。如何填充第三个列表?并且,这是List<>
的正确使用,如果没有,我应该使用什么?
修改:很抱歉,在此方法运行之前,textInput
和textCompare
从两个文件中读取并填充了7个字符的字符串:一个从一个文本文件,另一个来自Excel工作表。然后我删除任何空值,并尝试将这两个列表与listA.intersects(listB)
进行比较。 MSDN提到需要枚举它才能使交叉工作,这就是为什么我把它放在foreach中。
void Compare()
{
List<string> matches = new List<string>();
textInput.Sort();
textCompare.Sort();
progressBar.Maximum = textInput.Count;
int increment = 0;
for (int i = textCompare.Count - 1; i >= 0; i--)
{
if (textCompare[i] == null)
{
textCompare.RemoveAt(i);
}
}
foreach (string item in textInput)
{
matches = textInput.Intersect(textCompare).ToList();
increment++;
progressBar.Value = increment;
}
//A break point placed on the foreach reveals matches is empty.
foreach (object match in matches)
{
streamWriter.WriteLine(match);
}
doneLabel.Text = "Done!";
}
答案 0 :(得分:2)
不确定为什么你在循环中有这个。
foreach (string item in textInput)
{
matches = textInput.Intersect(textCompare).ToList();
increment++;
progressBar.Value = increment;
}
你只需要
matches = textInput.Intersect(textCompare).ToList();
如果您尝试类似
的话List<string> matches = new List<string>();
List<string> textInput = new List<string>(new[] {"a", "b", "c"});
textInput.Sort();
List<string> textCompare = new List<string>(new[] { "b", "c", "d" }); ;
textCompare.Sort();
int increment = 0;
for (int i = textCompare.Count - 1; i >= 0; i--)
{
if (textCompare[i] == null)
{
textCompare.RemoveAt(i);
}
}
matches = textInput.Intersect(textCompare).ToList();
匹配应该有{ "b , "c" }
。所以你的问题可能在其他地方。
答案 1 :(得分:2)
根据评论中的说明,可以这样做:
var textOutput = textCompare.Where(s => !string.IsNullOrEmpty(s))
.Intersect(textInput)
.OrderBy(s => s);
File.WriteAllLines("outputfile.txt", textOutput);
请注意,如果您的主列表“textInput”中没有空字符串,则可以删除.Where()
条件(很可能没有)。此外,如果订单无关紧要,请删除.OrderBy()
,然后结果:
var textOutput = textCompare.Intersect(textInput);
File.WriteAllLines("outputfile.txt", textOutput);
答案 2 :(得分:0)
考虑这样的事情:
void Compare()
{
textCompare.RemoveAll(x => string.IsNullOrEmpty(x));
List<string> matches= textInput.Intersect(textCompare).ToList();
matches.ForEach(x=> streamWriter.WriteLine(x));
doneLabel.Text = "Done!";
}