C#比较两个排序列表并输出到文件

时间:2011-03-07 04:12:02

标签: c# linq

我正在尝试将一起编译的字符串列表与主列表进行比较,然后将它们打印到文本文件中。我遇到的问题是可打印列表仍然是空的。如何填充第三个列表?并且,这是List<>的正确使用,如果没有,我应该使用什么?

修改:很抱歉,在此方法运行之前,textInputtextCompare从两个文件中读取并填充了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!";
} 

3 个答案:

答案 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)

考虑这样的事情:

  • 甚至是必要的2种电话吗?
  • 使用LINQ扩展方法删除空白/空值
void Compare()
{
    textCompare.RemoveAll(x => string.IsNullOrEmpty(x));

    List<string> matches= textInput.Intersect(textCompare).ToList();

    matches.ForEach(x=> streamWriter.WriteLine(x));

    doneLabel.Text = "Done!";
}