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 Group By返回新元素_C#_Linq_.net 3.5_C# 3.0_Linq To Xml - Fatal编程技术网

C# 使用LINQ Group By返回新元素

C# 使用LINQ Group By返回新元素,c#,linq,.net-3.5,c#-3.0,linq-to-xml,C#,Linq,.net 3.5,C# 3.0,Linq To Xml,我有以下代码,弄糊涂了: 我有一个查询,返回一组被标识为重复的记录,然后我想为每个记录创建一个XElement。我想这应该在一个查询中完成,但我现在迷路了 var f = (from x in MyDocument.Descendants("RECORD") where itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID"))

我有以下代码,弄糊涂了:

我有一个查询,返回一组被标识为重复的记录,然后我想为每个记录创建一个XElement。我想这应该在一个查询中完成,但我现在迷路了

var f = (from x in MyDocument.Descendants("RECORD")
                              where itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID"))
                              group x by x.Element("DOCUMENTID").Value into g
                              let item = g.Skip(1)  //Ignore first as that is the valid one
                              select item
                              );

var errorQuery = (from x in f 
                              let sequenceNumber = x.Element("DOCUMENTID").Value
                              let detail = "Sequence number " + sequenceNumber + " was read more than once"
                              select new XElement("ERROR",
                                          new XElement("DATETIME", time),
                                          new XElement("DETAIL", detail),
                                          new XAttribute("TYPE", "DUP"),
                                          new XElement("ID", x.Element("ID").Value)
                                          )
                             );

x、 每次迭代,是元素的序列(不包括第一个元素)。我怀疑你想要:

from grp in f
from x in grp
let sequenceNumber = x.Element("DOCUMENTID").Value
//...
尽管您也可以根据需要在投影中显示组键,但可以进一步简化:

    var f = (from x in MyDocument.Descendants("RECORD")
             where itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID"))
             group x by x.Element("DOCUMENTID").Value);

    var errorQuery = (from grp in f
                      from x in grp.Skip(1)
                      let detail = "Sequence number " + grp.Key + " was read more than once"
    //...

我已经成功地编译了它,并且似乎可以工作,但是可能需要一些性能调整,或者我正在做一些低效的事情。你觉得怎么样

errorQuery = MyDocument.Descendants("RECORD")
                        .Where(x => itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID")))
                        .GroupBy(a => a.Element("DOCUMENTID"), (innerID, values) => values.OrderBy(b => b.Element("ID").Value))
                        .Skip(1)
                        .SelectMany(p => p)
                        .Select(item => new XElement("ERROR",
                                          new XElement("DATETIME", time),
                                          new XElement("DETAIL",  "Sequence number " + item.Element("DOCUMENTID").Value + " was read more than once"),
                                          new XAttribute("TYPE", "DUP"),
                                          new XElement("ID", item.Element("ID").Value)
                                          ));