什么数据结构适合解决这个问题?

时间:2010-12-11 03:37:01

标签: c# data-structures

我有一个包含一些关键字的xml。 xml的格式:

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

xml中的关键字数量是可变的,可以是任何数字(数字可以是数千)。

我有一个包含两列的文本文件。第一列包含关键字,第二列包含关键字的值。每个文本文件的大小约为50MB。根据xml中的关键字,我需要从文本文件中找到相应的值。我可以轻松地解析文本文件并获取值。

现在这是我的问题: 我有10个文本文件,我需要从所有这10个文本文件中找到xml中提到的关键字的值,并查看所有10个文本文件中关键字的值是否相同。我需要显示如下结果:

名称:在10个文本文件中找到3个不同的值, 城市:abcdef 电子邮件:johnsmith@example.com

无论哪个关键字在所有文件中具有相同的值,都应显示该值,否则显示该特定关键字存在多少个不同的值(数字)。

在C#中解决此问题最优雅的方法是什么?什么是适合此类问题的最佳数据结构?

4 个答案:

答案 0 :(得分:0)

假设所有数据都适合内存,您可以使用MultiMap,这是一个可以为每个唯一键获取多个值的映射。在C#中没有默认实现,但在网络上有很多(例如http://dotnetperls.com/multimap)。如果您需要有关如何解析文件以构建地图的更多详细信息,则需要提供有关文件格式的更多详细信息。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您问题的数据结构部分是通用Lookup

优雅的部分,LINQ毫不奇怪。 Enumerable.ToLookup MethodEnumerable.GroupBy Method的某种组合,具体取决于您需要将键与值相关联的工作量。

以下是GroupBy用法的treasure chest of examples

干杯,
Berryl

答案 3 :(得分:0)

如果您使用的是C#4.0,请尝试Dynamic Xml Reader