2

我在这里遇到了精神障碍,我希望我错过了一些明显的东西。

无论如何,假设我有一个如下所示的表:

ID 查找值排序顺序
============================================
1 个 1000
2 B 2000
3 B 2000
4 C 3000
5℃ 4000

我正在尝试使用 Linq 查找LookupValue相同但排序顺序不同的位置(这ID是我的数据库表上的 PK,与本练习无关)。

我认为最简单的方法是按LookupValue和分组SortOrder,然后找到LookupValue结果中出现两次以上的地方。

现在,我获取分组表的代码如下所示:

Dim KeySortPairs = From d In MyDataTable _
            Group By Key = d(LookupValue).ToString(), SortOrder = d(SortOrder).ToString() _
            Into Group _
            Select Key, SortOrder

查看调试输出,上面的代码产生了这个结果(这是正确的):

键排序顺序
=================
一个1000
B 2000
C 3000
C 4000

为了得到重复Key的,我正在查看这样的结果:

For Each Entry In KeySortPairs.Where(Function(t) t.Key.Count() > 1)
    'Multiple Sort Orders!!'
Next

但是,在此代码中,返回分组结果中的每个条目。我是否遗漏了什么,或者不应该只给我Key出现不止一次的条目?我认为由于我对VB.NET 的舒适度较低,我犯了Count()一个小错误,但我无法弄清楚——我尝试将WHERE一样的东西。

4

3 回答 3

2

键是一个字符串。

Key.Count 对字符串中的字符进行计数。


更改选择以包括组

Select Key, SortOrder, Group

并更改 where 子句以计算组

KeySortPairs.Where(Function(t) t.Group.Count() > 1)

或者,计算该组可能是矫枉过正。“任何”可以通过进行简短的枚举来节省时间。

KeySortPairs.Where(Function(t) t.Group.Skip(1).Any())

(语法可能不完美,我不知道 vb.linq)。

于 2008-10-13T15:12:03.260 回答
0

我认为您的每个语句都需要一个 groupby 。

尝试类似的东西

For Each Entry in KeySortPairs.GroupBy(expression).Where(
于 2008-10-13T15:12:19.357 回答
0

这真是个老问题。我只是在尝试。最初用 C# 编写解决方案,并通过一些在线转换器转换为 VB.NET。希望不要冒犯任何人。

 Dim tests As New List(Of test)() From { _
            New test() With { _
                Key.LookUp = "A", _
                Key.SortOrder1 = 1000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 3000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 4000 _
            } _
        }

  Dim query = From g In From t In testsGroup t By t.LookUpLet firstsortorder = g.First() Where g.Count() > 1 AndAlso g.Any(Function(t1) firstsortorder.SortOrder1 <> t1.SortOrder1)New With { _
  g.Key, _
  Key .result = g _
}

    For Each item As var In query
        Console.WriteLine("key " + item.Key)
        For Each item1 As var In item.result
            Console.WriteLine(vbTab & vbTab & "sort order " + item1.SortOrder1)
        Next
    Next
于 2015-07-02T15:49:53.403 回答