我在这里遇到了一个心理障碍,我希望我错过了一些显而易见的东西。
不管怎样,假设我有一张这样的表:
ID查找值排序顺序============================================1 A 10002000年2月2000年3月4 C 30005 C 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
查看调试输出,上面的代码会产生以下结果(这是正确的):
关键字排序顺序================A 1000B 2000C 3000C 4000
为了得到重复的Key
,我正在查看这样的结果:
For Each Entry In KeySortPairs.Where(Function(t) t.Key.Count() > 1)
'Multiple Sort Orders!!'
Next
然而,在这段代码中,分组结果中的每个条目都会返回。我是不是遗漏了什么,或者这个计数不应该只给我Key
不止一次出现的条目吗?我认为我犯了一个微不足道的错误,因为我对VB.NET的理解程度很低,但我无法理解——我曾尝试将Count()
移动到Linq表达式上的WHERE
子句中,但这给了我同样的结果。
Key是一个字符串。
Key。Count统计字符串中的字符数。
更改选择以包括组
Select Key, SortOrder, Group
并更改where子句以计算组
KeySortPairs.Where(Function(t) t.Group.Count() > 1)
或者,计算这个群体可能有些过头了。"Any"可以通过进行简短的枚举来节省时间。
KeySortPairs.Where(Function(t) t.Group.Skip(1).Any())
(语法可能不完美,我不知道vb.linq).
我认为在for每条语句中需要一个groupby。
试试之类的东西
For Each Entry in KeySortPairs.GroupBy(expression).Where(
这真是个老问题。我只是在尝试。最初用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