C# 什么';这个Lambda表达式怎么了?

C# 什么';这个Lambda表达式怎么了?,c#,linq,lambda,C#,Linq,Lambda,这是我的代码: var coordinateTratte = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder") .Descendants(ns + "Placemark").Select(n => { string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Spli

这是我的代码:

var coordinateTratte = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder")
    .Descendants(ns + "Placemark").Select(n =>              
    {
        string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Split(' ');
        foreach (var coordinate in coordinates)
        {
            var coordinateLatLng = coordinate.Split(',');
            return new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            };
        }
    });
它说,在
n=>
附近,有些值不能用Lambda表达式表示


我错在哪里?

问题是lambda表达式试图使用循环“逐段”返回项,而
Select
希望它立即返回整个内容

您可以通过多种方式修复代码-例如,您可以将
foreach
循环转换为
Select
,并使用
SelectMany
,如下所示:

var coordinateTratte = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder")
    .Descendants(ns + "Placemark").SelectMany(n =>
    { //                                 ^^^^
        string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Split(' ');
        return coordinates
           .Select(coordinate => coordinate.Split(','))
           .Select(coordinateLatLng => new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            });
    });
var coordinateTratteDict = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder")
    .Descendants(ns + "Placemark").Select((n,i) =>
    {
        string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Split(' ');
        return new {
            Index = i
        ,   CoordList = coordinates
           .Select(coordinate => coordinate.Split(','))
           .Select(coordinateLatLng => new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            })
            .ToList()
        };
    })
    .ToDictionary(p => "Block_"+p.Index, p => p.CoordList);
我想返回一个对象,例如
字典
,其中对象是纬度和经度

您可以这样更改代码:

var coordinateTratte = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder")
    .Descendants(ns + "Placemark").SelectMany(n =>
    { //                                 ^^^^
        string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Split(' ');
        return coordinates
           .Select(coordinate => coordinate.Split(','))
           .Select(coordinateLatLng => new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            });
    });
var coordinateTratteDict = doc.Descendants(ns + "Folder").First().Descendants(ns + "Folder")
    .Descendants(ns + "Placemark").Select((n,i) =>
    {
        string[] coordinates = n.Descendants(ns + "coordinates").First().Value.Split(' ');
        return new {
            Index = i
        ,   CoordList = coordinates
           .Select(coordinate => coordinate.Split(','))
           .Select(coordinateLatLng => new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            })
            .ToList()
        };
    })
    .ToDictionary(p => "Block_"+p.Index, p => p.CoordList);

请不要解释错误消息的含义,发布实际的错误消息。如果我错了,请纠正我,但是
n=>{…}
是否缺少一个
new
关键字来初始化一个新的匿名对象?@Serv这不是代码试图做的。
{…}
只是一个普通的匿名函数体,而不是试图创建任何对象。那么他为什么要分配属性latitude和longitude?@Serv这是一个试图在匿名函数内创建匿名对象的函数,它前面确实包含
new
return new{latitude=…,longitude=…};
。似乎有效!但如果我想返回一个对象,例如dictionary,该怎么办?对象在哪里是latitude和longitude?你能给我一个例子吗?是的,key是我想要的任何字符串。它足够了吗?或者你问过我其他信息了吗?让我们来看看。