有没有像.net字典一样的东西,有重复的键来填充文本文件

本文关键字:文件 文本 填充 字典 net 一样 有没有 | 更新日期: 2023-09-27 18:15:13

我有一个文本文件,结构如下

01|value|value|value|value|value|value
02|value|value|value|value|value|value
03A|value|value|value|value|value|value
03A|value|value|value|value|value|value
.
.
N
04|value|value|value|value|value|value
05|value|value|value|value|value|value
06|value|value|value|value|value|value
.
.
N (variable lines)

我试图读取文本文件并将其添加到<string, string[]>类型的字典中,以便像MyDic["01"][0]一样使用它,这是代码的片段:

Dictionary<string, string[]> txtFromFile= new Dictionary<string, string[]>();
string strLine;
using (StreamReader sr = new StreamReader(filePath))
{
   while ((strLine= sr.ReadLine()) != null)
   {
      string[] strNodes= strLine.Split('|');
      txtFromFile.Add(strNodes[0], strNodes);
   }
}

不幸的是,正如你所看到的,这个文本文件可能有像03A这样的重复键,所以我想知道c#中是否有一个集合来实现这一点。

我看到一个名为lookup的类,但是没有它的构造函数。

    朋友们,有什么想法吗?
  1. 你有什么建议?

谢谢!

有没有像.net字典一样的东西,有重复的键来填充文本文件

为什么不直接创建一个像

public class MyLine
{
  string key { get;set;}
  string[] value {get;set;}
}

并存储在一个通用列表

您可以使用ToLookup扩展方法:

string[] lines = File.ReadAllLines(filePath);
ILookup<string, string[]> result = lines
    .Select(line => line.Split('|'))
    .ToLookup(parts => parts[0]);

第一个问题是,如果您关注具有相同键的多个条目,则您试图使用错误的类型。您可以使用List<KeyValuePair<string, string[]>>和您自己的查找函数(可能通过扩展类)来实现这一点,或者您可以在字典中添加另一个字典作为您的值类型:Dictionary<string, Dictionary<int, string[]>>。Dictionary选项是更好的选择,因为它具有更好的性能。

如何使用自定义类型的List ?

class KeyValue 
{ 
 String ID { get ; set ; } 
 List<String> Values { get ; private set ;}
 (..Constructor etc...)
}
List<KeyValue> myValues = new List<KeyValue>();
while ((strLine= sr.ReadLine()) != null)
{
 string[] strNodes= strLine.Split('|');
 myValues.Add(new KeyValue(strNodes[0],strNodes));
} 

您可以使用List<KeyValuePair<string, string[]>>List<Tuple<string, string[]>>

(当然,您可能更喜欢不同的集合类型,而不是List<>)

我不确定您是否试图区分第一个03A行上的值与第二个03A行上的值,但我认为您正在寻找NameValueCollectionNameValueCollections允许您向同一个键添加多个值,并且Add()方法应该在附加值/创建新的键/值条目之前检查先前存在的键。

在那篇MSDN参考文章的底部有一个使用NameValueCollection的好例子,所以你应该能够使用它来确定它是否是你真正需要的。

另一个想法是使用

Dictionary<string, List<string[]>>

其中"string"是可能重复的值。当它被重复时,你在里面创建另一个Dictionary。如果一行只存在一次,它将有一个List。如果发现重复行,则添加另一行。通过这种方式,您可以通过list的计数看到有多少重复行。