【问题标题】:How to compare two List content data and return mismatch value? [duplicate]如何比较两个 List 内容数据并返回不匹配值? [复制]
【发布时间】:2013-04-20 06:52:04
【问题描述】:

我有两个列表。其中内容为简单字符串值。例如:

IList1 内容:

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

列表2内容:

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

我想比较两个列表,它会返回不匹配的值。就像在这种情况下,它将返回“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;
    }

谁能帮帮我? 提前致谢。

【问题讨论】:

  • List&lt;string&gt; differ = new List&lt;string&gt;();
  • 在Comparator方法里面,改变Listdiff = null;对于 List 不同 = new List();
  • List&lt;string&gt; differ = null; // 你的错误来自这里。
  • 元素的顺序或出现次数是否与所需结果相关?
  • List 不同 = new List();

标签: c# .net linq list


【解决方案1】:

Except 方法完全符合您的描述,因此只需调用 ToList 即可在 List&lt;T&gt; 中获得结果:

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

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

    List<string> differ = null;

改成:

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

不过,我建议使用ToList()。 YouComparator 方法不需要:

        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

【讨论】:

  • 但是,在我的情况下它不起作用。抛出异常。我在这里缺少什么?
  • 所以你的错误在其他地方。我已经发布了整个方法代码,它按预期工作。
  • 非常感谢@MarcinJuraszek。它工作正常。我错过了这一行 List difference = list2.Except(list1).ToList();
【解决方案2】:

问题出在这一行:

List<string> differ = null;

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

您可以按如下方式更改:

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

但更简单的是替换这一行:

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

作者:

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

【讨论】:

    【解决方案3】:

    使用Except

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

    【讨论】:

    • 他已经在使用 except。
    【解决方案4】:

    问题就在这里。

    List<string> differ = null;
    

    需要

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多