有没有像.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的类,但是没有它的构造函数。
- 朋友们,有什么想法吗?
- 你有什么建议?
谢谢!
为什么不直接创建一个像
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
行上的值,但我认为您正在寻找NameValueCollection
。NameValueCollections
允许您向同一个键添加多个值,并且Add()
方法应该在附加值/创建新的键/值条目之前检查先前存在的键。
在那篇MSDN参考文章的底部有一个使用NameValueCollection的好例子,所以你应该能够使用它来确定它是否是你真正需要的。
另一个想法是使用
Dictionary<string, List<string[]>>
其中"string"是可能重复的值。当它被重复时,你在里面创建另一个Dictionary。如果一行只存在一次,它将有一个List。如果发现重复行,则添加另一行。通过这种方式,您可以通过list的计数看到有多少重复行。