Какая структура данных подойдет для решения этой проблемы? - PullRequest
0 голосов
/ 11 декабря 2010

У меня есть XML, который содержит несколько ключевых слов.Формат xml this:

<keywords>
 <keyword name="Name" />
 <keyword name="City" />
 <keyword name="Email" />
<keywords>

Количество ключевых слов в xml является переменным и может быть любым (число может быть в тысячах).

У меня есть текстовый файл, который имеетдве колонки.Первый столбец содержит ключевые слова, а второй столбец имеет значение для ключевого слова.Размер каждого текстового файла составляет около 50 МБ.Основываясь на ключевых словах в XML, мне нужно найти соответствующие значения из текстового файла.Я могу легко разобрать текстовый файл и получить значения.

Теперь вот моя проблема: у меня есть 10 текстовых файлов, мне нужно найти значения для ключевых слов, упомянутых в xml, из всех этих 10 текстовых файлов и посмотреть, если значениядля ключевых слов из всех 10 текстовых файлов одинаковы или нет.Мне нужно отобразить результаты, подобные этим:

Имя: 3 различных значения найдены в 10 текстовых файлах, Город: abcdef Электронная почта: johnsmith@example.com

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

Какой самый элегантный способ решения этой проблемы в C #?Какая структура данных лучше всего подходит для таких проблем?

Ответы [ 4 ]

0 голосов
/ 11 декабря 2010

Попробуйте Dynamic Xml Reader , если вы используете C # 4.0

0 голосов
/ 11 декабря 2010
class KeyWord{
   private String name;
   private String value;
   public KeyWord(String k, String v){
      name = k;
      value = v;
   }
 }

 // different file 

 private List<KeyWord> keywords = new List<KeyWord>();

Список хорош.

В противном случае, если у вас есть определение XML-схемы, вы можете динамически генерировать классы

"C: \ Program Files \ Microsoft Visual Studio 9 \ SDK \ v2.0 \ Bin \ xsd.exe" / classes /namespace:x.y.z schemaforkeywords.xsd

0 голосов
/ 11 декабря 2010

Часть структуры данных вашего вопроса является общей Lookup

Элегантная часть, что неудивительно, LINQ. Некоторая комбинация Метод Enumerable.ToLookup или Метод Enumerable.GroupBy , в зависимости от того, сколько вам нужно сделать, чтобы связать ключи со значениями.

Вот сундук с сокровищами примеров для использования GroupBy

Приветствия
Berryl

0 голосов
/ 11 декабря 2010

Предполагая, что все данные помещаются в память, вы можете использовать MultiMap, то есть карту, которая может принимать несколько значений для каждого уникального ключа. В C # нет реализации по умолчанию, но есть много в сети (например, http://dotnetperls.com/multimap).). Если вам нужно больше подробностей о том, как анализировать файлы для построения карты, вам нужно будет предоставить более подробную информацию о формате файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...