我的日志文件中有以下数据。
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
,但仍然无法获得解决方案。
答案 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是框架级语法糖,除了使编写更容易和更易读之外,它本身并没有做任何更好的代码。但在这种情况下,我认为明确使用您的方法更具可读性。特别是因为解析文件可能是一个相对重要的操作方案。