通过在LINQ中解析文本来创建字典

时间:2014-08-01 05:32:35

标签: c# linq dictionary

我的日志文件中有以下数据。

Element1
data1
data2
data3
Element2
data1
data4
data6
Element3
data9
data3
data5
....

等等。

我想通过解析这个文件来创建一个字典:

Dictionary (int, List (( string)) <br/>

其中int是Element1中的数字 - &gt; 1,Element2 - &gt; 2,而Element1之后的数据包含在List中。

所以,
对于Element1,Dictionary<1, List<<string>>将包含列表{ data1, data2, data3 }
对于Element2,Dictionary<2, List<<string>>将包含列表{ data1, data4, data6 }
......等等。

我做了一些编程,比如

string lines [ ] = File.ReadAllLines ( path );
foreach ( string s in lines )
{
    // processing lines to find element and then record each line after
    // till I find another element or EOL.
}

我想将此转换为LINQ语句,但我无法找到答案。我试图查看LINQ命令TakeWhile,但仍然无法获得解决方案。

1 个答案:

答案 0 :(得分:0)

我认为你不能用LINQ做到这一点,即使你可以,也没有比写一个方法更有效或更有效。

private IEnumerable<KeyValuePair<string, Tuple<string, string, string>>> ReadAll(string path)
{ // you might want some more concrete types here, but this will help turn it into a dictionary just as well as anything else.

    using (var reader = new StreamReader(path))
    {
        string title;

        while ((title = reader.ReadLine()) != null)
        {
            string data1 = reader.ReadLine();
            string data2 = reader.ReadLine();
            string data3 = reader.ReadLine();

            yield return new KeyValuePair<string, Tuple<string, string, string>>(title, new Tuple<string, string, string>(data1, data2, data3));
        }
    }
}

您仍然可以获得IEnumerable<T>的所有好处,但如果需要,这种方式可以帮助您维护和扩展它。

您可以使用简单的方法构建字典:

return ReadAll(path).ToDictionary(c => c.Key, c => c.Value);

但是,即使你可以用LINQ做这件事,无论如何这都是它在幕后做的事情。 LINQ是框架级语法糖,除了使编写更容易和更易读之外,它本身并没有做任何更好的代码。但在这种情况下,我认为明确使用您的方法更具可读性。特别是因为解析文件可能是一个相对重要的操作方案。