文件夹中有多个文件,代码应逐个读取。我必须从文件中提取一些键值来执行一些业务逻辑。
文件看起来像这样,
x-sender:
x-receiver:
Received:
X-AuditID:
Received:
Received:
From:
To:
Subject:
Thread-Topic:
Thread-Index:
Date:
Message-ID:
Accept-Language:
Content-Language:
X-MS-Has-Attach:
根据文件,有多个键可以增加和减少。密钥的顺序也可以改变。每把钥匙都有一定价值。
代码:
private void BtnStart_Click(object sender, EventArgs e)
{
// searches current directory
foreach (string file in Directory.EnumerateFiles(NetWorkPath, "*.eml"))
{
var dic = File.ReadAllLines(file)
.Select(l => l.Split(new[] { ':' }))
.ToDictionary(s => s[0].Trim(), s => s[1].Trim());
string myUser = dic["From"];
}
}
我试图读取文件并将其转换为字典,以便我可以使用Keys访问。但它给了我一个错误"An item with the same key has already been added.".
任何帮助??
答案 0 :(得分:3)
您可以使用ToDictionary
ToLookup
......same code....
.Where(s => s.Length>1)
.ToLookup(s => s[0].Trim(), s => s[1].Trim());
然后你可以检查为
string myUser = dic["From"].FirstOrDefault();
答案 1 :(得分:2)
这是因为Receieved
多次出现,Dictionary
不允许重复输入密钥值。
您可以使用Tuple<string, string>
,这将允许重复。
如果您不想退回,可以使用匿名类型:
foreach (string file in Directory.EnumerateFiles(NetWorkPath, "*.eml"))
{
var items = myList
.Select(l => l.Split(new [] {':' }, StringSplitOptions.RemoveEmptyEntries))
.Where(l => l != null && l.Count() == 2)
.Select(l => new
{
Key = l[0],
Value = l[1],
})
.ToList();
string myUser = items.First(i => i.Key == "From").Value;
}
答案 2 :(得分:0)
您有2个具有相同名称的元素 - 已收到:
答案 3 :(得分:0)
这意味着您已经在字典中添加了两次相同的密钥, 对于您的文件的内容,它是收到的: