【问题标题】:How to element-wise compare arrays in LINQ functions如何在 LINQ 函数中逐元素比较数组
【发布时间】:2014-05-14 14:53:19
【问题描述】:

我的问题如下:

Dim dt As DataTable = GetSomeDataTable()
Dim exceptions As List(Of String())({{"a","b"},{"c","d"}})
For Each j As Integer In Enumerable.Range(0, dt.Rows.Count) _
                                   .Where(Function(j1) exceptions.Contains({CStr(dt.Rows(j1)(0)), CStr(dt.Rows(j1)(1)}))
    ' Do something
Next

在上面,循环中的代码永远不会执行,即使 dt 中有行具有第一个元素“a”,第二个元素“b”,例如,因为 IEnumerable.Contains 方法不匹配一个数组 {" a", "b"} 和另一个数组 {"a", "b"}。我猜比较是通过引用而不是通过值来完成的?我想要的是 Contains 方法考虑两个数组 A 和 B 相等,当且仅当 A(i) = B(i) 对于所有 i = 0, 1, ... 。我也注意到 IEnumerable.Distinct() 的这种行为,并通过制作自定义 EqualityComparer 来克服它,但我觉得这很麻烦。有谁知道实现这一目标的更巧妙的方法?或者只是比较.Net中多元素主键的一般方法? (用非法字符连接字符串不算数。)

【问题讨论】:

    标签: .net arrays vb.net linq iequalitycomparer


    【解决方案1】:

    您的问题是您尝试比较数组。你是对的,比较是通过引用而不是通过值来完成的。要么使用另一种类型,如 Tuple,要么使用 Join(这也可能比 Where/Contains 组合更快):

    Dim rows = from row in dt.AsEnumerable()                     
               join e in exceptions on row(0) Equals e(0) And row(1) Equals e(1)
    
    For Each row in rows
        ' do something '
    Next
    

    【讨论】:

    • 谢谢,我试试这个!
    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 2022-01-08
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多