如何比较两个List内容数据和返回不匹配值?

时间:2013-04-18 13:56:12

标签: c# .net linq list

我有两个List。哪个内容简单的字符串值。例如:

IList1内容:

  • 复仇者联盟
  • 快门岛
  • 黑暗骑士崛起

List2内容:

  • 复仇者联盟
  • 快门岛
  • 黑暗骑士崛起
  • 公园和娱乐
  • 丑闻

我想比较两个列表,它会返回不匹配的值。就像在这种情况下一样,它将返回“Parks and Recreation”和“Scandal”,因为它们与List1的值不匹配。

我试了一下。但它抛出异常“对象引用未设置为对象的实例”。

static void Main(string[] args)
    {
        List<string> list1 = new List<string>();
        list1.Add("The Avengers");
        list1.Add("Shutter Island");
        list1.Add("Inception");
        list1.Add("The Dark Knight Rises");

        List<string> list2 = new List<string>();
        list2.Add("The Avengers");
        list2.Add("Shutter Island");
        list2.Add("Inception");
        list2.Add("The Dark Knight Rises");
        list2.Add("Parks and Recreation");
        list2.Add("Scandal");    

       try
        {
            List<string> difference = Comparator(list1, list2);
            foreach (var value in difference)
            {
                Console.WriteLine(value);
            }
        }
        catch (System.NullReferenceException e)
        {
            Console.WriteLine(e.Message);    
        }

        Console.ReadLine();

    }
    public static List<string> Comparator(List<string> list1, List<string> list2)
    {
        IEnumerable<string> differenceQuery = list1.Except(list2);
        List<string> differ = null;

        foreach (string s in differenceQuery)
            differ.Add(s);

        return differ;
    }

任何人都可以帮助我吗? 提前谢谢。

4 个答案:

答案 0 :(得分:8)

Except方法完全符合您的描述,因此只需致电ToList即可获得List<T>的结果:

return list2.Except(list1).ToList();

您的代码抛出NullReffereceException因为differ变量未初始化:

    List<string> differ = null;

将其更改为:

    List<string> differ = new List<string>();

但是,我建议使用ToList()。您不需要Comparator方法:

        List<string> difference = list2.Except(list1).ToList()
        foreach (var value in difference)
        {
            Console.WriteLine(value);
        }

更新 - 整个代码,按预期工作

static void Main(string[] args)
{
    List<string> list1 = new List<string>();
    list1.Add("The Avengers");
    list1.Add("Shutter Island");
    list1.Add("Inception");
    list1.Add("The Dark Knight Rises");

    List<string> list2 = new List<string>();
    list2.Add("The Avengers");
    list2.Add("Shutter Island");
    list2.Add("Inception");
    list2.Add("The Dark Knight Rises");
    list2.Add("Parks and Recreation");
    list2.Add("Scandal");

    List<string> difference = list2.Except(list1).ToList();
    foreach (var value in difference)
    {
        Console.WriteLine(value);
    }

    Console.ReadLine();
}

结果

Parks and Recreation
Scandal

答案 1 :(得分:5)

问题在于这一行:

List<string> differ = null;

之后,您尝试向列表中添加内容,但列表为null。你有例外。

您可以按如下方式更改:

List<string> differ = new List<string>();

但更容易取代这一行:

List<string> difference = Comparator(list1, list2);

人:

List<string> difference = list1.Except(list2).ToList();

答案 2 :(得分:1)

使用Except

var difference = list1.Except(list2).ToList();

答案 3 :(得分:1)

问题就在这里。

List<string> differ = null;

需要

List<string> differ = new List<string>();