Получение счетчика из Grouped DataTable в VB через Linq

У меня здесь мысленный барьер, и я надеюсь, что упускаю что-то очевидное.

В любом случае, предположим, что у меня есть таблица, которая выглядит так:

ID            LookupValue         SortOrder
============================================
1             A                   1000
2             B                   2000
3             B                   2000
4             C                   3000
5             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

Глядя на вывод отладки, приведенный выше код дает следующий результат (который является правильным):

Key    SortOrder
================
A      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 в выражении Linq, но это дал мне то же самое.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
8 594
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Ключ - это строка.

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).

Ах да! Это объясняет, почему t.Key.Count ()> 7 (тест, который я пробовал) не возвращал результатов!

jerhinesmith 13.10.2008 19:16

Кроме того, подсчет группы, похоже, не работает. Логически я не уверен, что это имеет смысл, поскольку по определению group by будет возвращать только одну уникальную пару Key, SortOrder - правильно?

jerhinesmith 13.10.2008 19:56

Группы в linq иерархические, в отличие от SQL. У группы есть ключ и один или несколько дочерних элементов. Доступ к этим элементам можно получить, перечислив группу. msdn.microsoft.com/en-us/library/bb344977.aspx

Amy B 13.10.2008 20:04

Я думаю, вам нужна группа для каждого утверждения.

Попробуйте что-нибудь вроде

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

Другие вопросы по теме