Nano Hash - криптовалюты, майнинг, программирование

Как получить записи с общими значениями для одного элемента из List‹KeyValuePair‹string, string››?

Скажем, у меня есть объект List<KeyValuePair<string, string>> со следующими записями, представляющими имена собак и маркеры различных пород, с которыми они рождаются:

Name                BreedMarkers

Spot                PUG
Spot                PITBULL
Spot                BASSETT
Rover               DACHSHUND
Meat                PUG
Meat                ROTTWEILER

Я хочу захватить только те пары строк, которые имеют общие BreedMarkers. Например, поскольку Spot и Meat имеют общие маркеры для PUG, я хочу сократить словарь, чтобы удалить все, кроме этих пар. Конечный результат должен быть:

Name (Key)          BreedMarkers (Value)

Spot                PUG
Meat                PUG

До сих пор я пытался вывести элементы для разделения List<string> объектов, а затем пробовал join между ними, но это код вонючий и я надеюсь, что есть более элегантный способ.


  • как у вас могут быть дубликаты ключей в словаре? 21.02.2014
  • Словари не могут иметь повторяющихся ключей. 21.02.2014
  • как у вас может быть дубликат ключа в Dictionary??? Какой тогда смысл пользоваться словарем? 21.02.2014
  • @JonHanna, я спрашивал в контексте этого вопроса. 21.02.2014
  • Извините, все плохо, я отредактировал соответственно в контексте массива строк вместо словаря. 21.02.2014
  • ...У вас есть массив строк с Spot ‹spaces› PUG? (т.е. каковы именно значения String в массиве? 21.02.2014
  • @Mayank, извини, я думал, ты отвечаешь Хабибу. 21.02.2014
  • @crashmstr Я рад, что сегодня пятница. Вместо этого скажем, что это объект, похожий на хеш-таблицу, который соответствует таблице с двумя столбцами, Name и BreedMarker, и имеет несколько записей, как описано выше. Извините за путаницу! 21.02.2014
  • Вместо этого скажем, что это объект, похожий на хеш-таблицу, который соответствует таблице с двумя столбцами: Name и BreedMarker? Какой объект похож на хэш-таблицу? От этого зависит наилучший подход. (Уже данный ответ может быть таким, а может и нет). 21.02.2014
  • @JonHanna Я предполагаю, что это будет объект, эквивалентный таблице SQL с двумя столбцами и без поля идентификации, аналогичной структуре выше. 21.02.2014
  • @JonHanna На самом деле сделайте это List<KeyValuePair<string, string>> на основе этого. 21.02.2014

Ответы:


1

ToLookup создаст новый ILookup (похожий на IDictionary, но с несколькими значениями для каждого ключа), где значения становятся ключами, и наоборот:

myNewDict = myOldList.ToLookup(x => x.Value, x => x.Key);
var results = myNewDict["PUG"]; // Spot, Meat

Или просто:

var results = myOldList.Where(x => x.Value == "PUG").Select(x => x.Key);

Если вы планируете выполнять поиск по нескольким значениям, лучше использовать ToLookup; в противном случае Where хорошо.

21.02.2014
  • Возможно, им было бы лучше использовать список, кортежи или пары или поиск по противоположному шаблону, в зависимости от того, что они на самом деле пытаются сделать в целом. 21.02.2014
  • @ Тим С. спасибо за ваш ответ, но в спешке я забыл, что ключи словаря должны быть уникальными, я больше отредактировал вопрос в контексте объекта, похожего на хеш-таблицу. 21.02.2014
  • @ Тим С., основываясь на ваших предложениях, у меня есть это: var commonMarkers = namesMarkers.ToLookup(nm => nm.Key, nm => nm.Value);, где namesMakers - это List<KeyValuePair<string, string>>. Думаю, это поможет. 21.02.2014
  • @DarthContinent Я немного обновил свой ответ. Так случилось, что я использовал ваш словарь просто как IEnumerable<KeyValuePair<string, string>>, который работает и с вашим List<>. Я думаю, вы хотите поменять местами ваши Key/Value в поиске (как у меня), чтобы вы искали BreedMarkers, а не Name. 21.02.2014
  • Да, теперь вопрос яснее, яснее, что это путь. Можно также захотеть, чтобы .ToLookup(x => x.Value) сохранил полные пары из оригинала при поиске. (Или для формы, использующей Where, чтобы опустить Select). 21.02.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..