Есть ли структура данных, которая содержит наборы данных в .NET? - PullRequest
8 голосов
/ 10 февраля 2010

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

Например, я бы использовал это так:

var data = new FancyDataStructure();

data.Add(new string[] {"Elizabeth", "Liz", "Betty"});
data.Add(new string[] {"Bob", "Robert", "Rob"});

string[] alternateNames1 = data["Betty"];
string[] alternateNames2 = data["Liz"]

В этом случае alternateNames1 будет массивом, содержащим «Лиз» и «Элизабет», а alternateNames2 будет массивом, содержащим «Элизабет» и «Бетти».

Я не хочу изобретать это заново, но я не нашел примеров такой структуры.

Обновление

Спасибо тем, кто написал обратно с предложениями. Многие люди предлагают использовать какую-то версию Dictionary<string, IEnumerable<string>>. В настоящее время я использую этот подход, но на самом деле он не соответствует требованию, не будучи ужасно сложным в обслуживании. Каждое значение в каждом списке должно быть способно функционировать как ключ к любому другому значению, когда-либо добавленному к нему в наборе.

Таким образом, учитывая следующее:

data.Add(new string[] {"Elizabeth", "Liz"}
data.Add(new string[] {"Liz", "Betty"}
alternates = data["Betty"];

Я бы ожидал, что теперь в альтернативах будут присутствовать "Элизабет" и "Лиз".

Похоже, мне просто нужно построить такую ​​структуру, которая бы соответствовала моим потребностям. Продолжайте воплощать идеи в жизнь!

Brian

Ответы [ 12 ]

0 голосов
/ 10 февраля 2010

Стандарт de facto alt.net находится в Iesi.Collections, но библиотека базовых классов имеет только HashSet<T> в dotnet 3.5 или выше.

Я использовал предложения типа group by в linq для простого удаления дубликатов из произвольных IEnumerable<T> коллекций, но это не совсем дает вам семантику набора.

HashSet <> близок к тому, что вы хотите.

Исходя из ваших требований, я не думаю, что есть что-то готовое, что сопоставило бы строки с уже существующими коллекциями; в основном вам нужно написать класс, который принимает метод, подобный StoreAssociations<<T>>(IEnumerable<<T>> names), преобразует IEnumerable в HashSet и выполняет итерацию по каждому элементу в HashSet, чтобы добавить отображение в IDictionary<string,HashSet<T>> во вновь созданный хэш-набор.

0 голосов
/ 10 февраля 2010

Что-то вроде этого кажется достаточно простым.

var data = new List<string[]>();

data.Add(new string[] {"Elizabeth", "Liz", "Betty"});
data.Add(new string[] {"Bob", "Robert", "Rob"});

var alternateNames1 = data.Where(x =>x.Contains("Betty")).Select(x => x.Where(y => y != "Betty"));
...