我有一个包含一些关键字的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#中解决此问题最优雅的方法是什么?什么是适合此类问题的最佳数据结构?
答案 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 Method或Enumerable.GroupBy Method的某种组合,具体取决于您需要将键与值相关联的工作量。
以下是GroupBy用法的treasure chest of examples
干杯,
Berryl
答案 3 :(得分:0)
如果您使用的是C#4.0,请尝试Dynamic Xml Reader