将LINQ字符串[]转换为单个结构体
本文关键字:单个 结构体 转换 LINQ 字符串 | 更新日期: 2023-09-27 18:11:35
我目前正在编写一段代码,该代码逐行读取文件,分割它,然后存储在数据结构中,即我有单行由空格分隔,我想分割成13个元素,每个元素对应于结构中的一个项目。我试图使用以下数据结构的LINQ来做到这一点:
public struct LogDetails
{
public string LogDate { get; set; }
public string LogTime { get; set; }
public string csMethod { get; set; }
public string csUriStem { get; set; }
public string csUriQuery { get; set; }
public string csUserName { get; set; }
public string cIp { get; set; }
public string csUserAgent { get; set; }
public string csReferrer { get; set; }
public string scStatus { get; set; }
public string scSubStatus { get; set; }
public string scBytes { get; set; }
public string csBytes { get; set; }
}
在文件中读取的LINQ代码如下所示:
var output = inputStream.ReadLine().Split(' ').GroupBy(f => f).AsEnumerable()
.SelectMany(g => g);
当我运行这个程序时,它按预期从文件中读取该行,并返回我需要填充结构体的13个单独的元素。然而,当我试图检索这些元素时,我遇到了问题。理想情况下,我希望能够做一些像下面(非工作)的代码:
IEnumerable<LogDetails> details = inputStream.ReadLine().Split(' ').GroupBy(f => f).AsEnumerable()
.SelectMany(g => new LogDetails
{
LogDate = g.ElementAt(0).ToString(),
LogTime = g.ElementAt(1).ToString()
//rest of the struct goes here
}).ToList();
任何建议感谢!
安德鲁<标题> 更新感谢大家的回复。对于感兴趣的人来说,完整的代码如下:
IEnumerable<LogDetails> details = null;
details = File.ReadAllLines(pFileName)
.Select(l => new { split = l.Split(' ') })
.Select(s => new LogDetails
{
LogDate = s.split.ElementAtOrDefault(0),
LogTime = s.split.ElementAtOrDefault(1),
csMethod = s.split.ElementAtOrDefault(2),
csUriStem = s.split.ElementAtOrDefault(3),
csUriQuery = s.split.ElementAtOrDefault(4),
csUserName = s.split.ElementAtOrDefault(5),
cIp = s.split.ElementAtOrDefault(6),
csUserAgent = s.split.ElementAtOrDefault(7),
csReferrer = s.split.ElementAtOrDefault(8),
scStatus = s.split.ElementAtOrDefault(9),
scSubStatus = s.split.ElementAtOrDefault(10),
scBytes = s.split.ElementAtOrDefault(11),
csBytes = s.split.ElementAtOrDefault(12)
}).ToList();
标题>
我不知道你为什么要用GroupBy
,我会用File.ReadLines
+ Enumerable.Select
:
IEnumerable<LogDetails> details = File.ReadLines(filePath)
.Select(l => new { Split = l.Split() })
.Select(x => new LogDetails
{
LogDate = x.Split.ElementAt(0),
LogTime = x.Split.ElementAtOrDefault(1),
//rest of the struct goes here
});
我不是说Linq是你最好的选择。Linq将循环遍历拆分数组中的每个项。您只需要用数组中的项初始化一个对象。
var items = inputStream.ReadLine().Split(' ');
var details new LogDetails {
LogDate = items[0],
LogTime = items[1]
//rest of the struct goes here
};
你的最终解决方案有一些冗余,只是想简化一下:
var details =
from line in File.ReadAllLines(pFileName)
let tokens = line.Split(' ')
select new LogDetails
{
LogDate = tokens[0],
LogTime = tokens[1],
csMethod = tokens[2],
csUriStem = tokens[3],
csUriQuery = tokens[4],
csUserName = tokens[5],
cIp = tokens[6],
csUserAgent = tokens[7],
csReferrer = tokens[8],
scStatus = tokens[9],
scSubStatus = tokens[10],
scBytes = tokens[11],
csBytes = tokens[12]
};