【问题标题】:Linq query two arrays for difference based on field comparisonLinq 根据字段比较查询两个数组的差异
【发布时间】:2016-11-09 10:37:53
【问题描述】:

我想使用 Linq 根据每个列表中的不同字段比较两个列表的值,其中列表项的值是一个字符串 [] 数组。

数组的格式如下:

数组 1

  • 列表
  • 每个 string[] 条目 4 个字段

数组 2

  • 列表
  • 每个 string[] 条目 15 个字段

我正在尝试比较数组 1 中字段 0 的值,以检查该值是否存在于数组 2 的字段 12 中的任何记录中,并返回数组 1 中没有在数组 2 中找到匹配项的记录。

到目前为止,我所拥有的是:

var r = array1.Where( p => array2.All( p2 => p2[12] != p[0] ) ).ToList();

这给了我以下错误:

“System.IndexOutOfRangeException”类型的未处理异常

我怎样才能做到这一点?我知道我可以做一个嵌套循环 O(n)^n,但这并不理想,这就是为什么我希望使用 Linq 来比较子值。

【问题讨论】:

  • 您可以使用Any 而不是All
  • 某些数组对您的规则无效。 (列表中的元素太少) 这是最大的问题,而不是您的查询。
  • array1array2 的类型是什么。请不要只解释代码!
  • 嵌套循环将是O(n^m)AllWhere 也是 O(n),所以它们会执行相同的操作
  • @M.kazemAkhgary 感谢您纠正数学问题。我知道这是一个指数,而不是精确的公式。关于这个问题,我确实弄清楚了——我将 4 数组传递给数组 2,将 12 数组传递给数组 1。所以上面的代码实际上确实有效 XD /facepalm。

标签: c# arrays linq


【解决方案1】:

我用你的代码描述做了一个例子,它工作得很好。 请检查您的数组大小是否正确?

private static void Main(string[] args)
{
    var array1 = new List<string[]>
    {
        new[] {"1", "2", "3", "4"},
        new[] {"A", "B", "C", "D"}
    };

    var array2 = new List<string[]>
    {
        new[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"},
        new[] {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"}
    };

    var r = array1.Where(p => array2.All(p2 => p2[12] != p[0])).ToList();

    r.ForEach(_ => Array.ForEach(_, Console.WriteLine));

    // output:
    // 1
    // 2
    // 3
    // 4
    // A
    // B
    // C
    // D
}

【讨论】:

  • 我在上面也注意到了这一点。该代码有效,只是我将错误的数组传递给包含此代码的方法。 XD。我的函数格式为:短数组,长数组。但我通过了:长数组,短数组。
  • @SamuelJackson 但请仔细检查您的代码逻辑。我不明白你真正想要比较什么,以及你对它有什么期望。如果您可以提供一些业务逻辑和更多代码(不仅仅是描述),也许社区可以提供更好的反馈(例如,关于 LINQ 优化)
  • 我很感激。我无法提供数据样本,因为它包含私人信息。我正在比较的是查看一份报告中的帐户 ID 列表是否存在于发送到银行的付款文件中。付款文件为定长格式,第一份报告为 csv。我可以转换所有数据,并剥离信息以使比较更容易,但我仍然需要返回数据,并且仍然需要递归比较。这就是 LINQ 真正大放异彩的地方。
【解决方案2】:

p 现在不是数组。使用:

var r = array1.Where( p => array2.All( p2 => p2[12] != p ) ).ToList();

【讨论】:

  • array1 字段 0 的比较在哪里,因为数组 1 包含 4 个字段
  • 对不起,我错过了。但问题肯定出在 p2[12] 或 p[0] 上。我的猜测不是数组中的所有元素都具有相同数量的值。我建议你检查数组中的元素。您还可以将元素设为类以确保它们共享相同的模式
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多