使用linq查询从文件中获取键值

时间:2013-05-30 09:16:09

标签: c# linq

文件夹中有多个文件,代码应逐个读取。我必须从文件中提取一些键值来执行一些业务逻辑。

文件看起来像这样,

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.".

任何帮助??

4 个答案:

答案 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)

这意味着您已经在字典中添加了两次相同的密钥, 对于您的文件的内容,它是收到的: