Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将LINQ字符串[]转换为单个结构_C#_Linq - Fatal编程技术网

C# 将LINQ字符串[]转换为单个结构

C# 将LINQ字符串[]转换为单个结构,c#,linq,C#,Linq,我目前正在编写一段代码,它逐行读取文件,将其拆分,然后存储在数据结构中,也就是说,我有一行以空格分隔,我想将其拆分为13个元素,每个元素对应于结构中的一个项。我正在尝试使用具有以下数据结构的LINQ执行此操作: public struct LogDetails { public string LogDate { get; set; } public string LogTime { get; set; } public string csMethod { get; set

我目前正在编写一段代码,它逐行读取文件,将其拆分,然后存储在数据结构中,也就是说,我有一行以空格分隔,我想将其拆分为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);
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();
当我运行它时,它会按照预期从文件中读取行,并返回填充结构所需的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 details=inputStream.ReadLine().Split(“”).GroupBy(f=>f).AsEnumerable()
.SelectMany(g=>newlogdetails)
{
LogDate=g.ElementAt(0).ToString(),
LogTime=g.ElementAt(1).ToString()
//结构的其余部分在这里
}).ToList();
任何建议,谢谢

安德鲁

更新 谢谢大家的回复。对于任何感兴趣的人,完整的代码如下:

var output = inputStream.ReadLine().Split(' ').GroupBy(f => f).AsEnumerable()
                                                      .SelectMany(g => g);
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();
IEnumerable details=null;
详细信息=File.ReadAllLines(pFileName)
.Select(l=>new{split=l.split(“”)})
。选择(s=>new LogDetails
{
LogDate=s.split.ElementAtOrderFault(0),
LogTime=s.split.elementatorderfault(1),
csMethod=s.split.ElementAtOrDefault(2),
csuritem=s.split.ElementAtOrDefault(3),
csUriQuery=s.split.ElementAtOrDefault(4),
csUserName=s.split.elementAtorderFault(5),
cIp=s.split.ElementAtorderFault(6),
csUserAgent=s.split.ElementAtOrDefault(7),
csreferer=s.split.elementatorderfault(8),
scStatus=s.split.ElementAtOrDefault(9),
scSubStatus=s.split.ElementAtorderFault(10),
scBytes=s.split.ElementAtOrderFault(11),
csBytes=s.split.ElementAtOrDefault(12)
}).ToList();

我不是苏·林克,这是你最好的选择。Linq将在分割数组中的每个项之间循环。您只需要使用数组中的项初始化对象

var items = inputStream.ReadLine().Split(' ');
var details new LogDetails {
                                 LogDate = items[0],
                                 LogTime = items[1]
                                 //rest of the struct goes here
                           };

我不是sue Linq是你最好的选择。Linq将在分割数组中的每个项之间循环。您只需要使用数组中的项初始化对象

var items = inputStream.ReadLine().Split(' ');
var details new LogDetails {
                                 LogDate = items[0],
                                 LogTime = items[1]
                                 //rest of the struct goes here
                           };

我不知道您为什么要使用
GroupBy
,我会使用
文件。ReadLines
+
可枚举。选择

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
     });
IEnumerable details=File.ReadLines(文件路径)
.Select(l=>new{Split=l.Split()})
.选择(x=>new LogDetails
{
LogDate=x.Split.ElementAt(0),
LogTime=x.Split.elementatorderfault(1),
//结构的其余部分在这里
});

我不知道您为什么要使用
GroupBy
,我会使用
文件。ReadLines
+
可枚举。选择

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
     });
IEnumerable details=File.ReadLines(文件路径)
.Select(l=>new{Split=l.Split()})
.选择(x=>new LogDetails
{
LogDate=x.Split.ElementAt(0),
LogTime=x.Split.elementatorderfault(1),
//结构的其余部分在这里
});

您的最终解决方案有一些冗余,只是想简化一下:

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]
    };

您的最终解决方案有一些冗余,只是想简化一下:

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]
    };

是的,这是我可能要走的路线…我选择LINQ的原因是因为我希望这样做,这样我可以读取整个文件,分成几行,将每行分成一个对象,然后在一个LINQ语句中返回一个对象列表。我想只是想变得太聪明吧@安德鲁,你最好不要在一份声明中把这一切都说出来。在
LogDetails
类中创建一个
staticlogdetails Parse(stringline)
函数,因为当您只想解析一行代码时,它是可重用的。然后你可以将整个文件解析为
file.ReadLines(filePath).Select(LogDetails.parse).ToArray()
。是的,这是我可能不得不走的路线……我选择LINQ的原因是因为我希望这样做,所以我可以读取整个文件,分成几行,将每行拆分为一个对象,然后在一条LINQ语句中返回所有对象的列表。我想只是想变得太聪明吧@安德鲁,你最好不要在一份声明中把这一切都说出来。在
LogDetails
类中创建一个
staticlogdetails Parse(stringline)
函数,因为当您只想解析一行代码时,它是可重用的。然后,您可以将整个文件解析为
file.ReadLines(filePath).Select(LogDetails.parse).ToArray()
。另外,这应该是一个类而不是一个结构。结构的最佳实践是相对较小的,因为它们是通过副本传递的,并且是不可变的。结构的最佳实践相对较小,因为它们是通过拷贝传递的,并且是不可变的。