这个Lambda表达式有什么问题?

mar*_*zzz 2 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.Split(' ');
        foreach (var coordinate in coordinates)
        {
            var coordinateLatLng = coordinate.Split(',');
            return new
            {
                latitude = coordinateLatLng.Last(),
                longitude = coordinateLatLng.First()
            };
        }
    });
Run Code Online (Sandbox Code Playgroud)

并且它附近n =>说一些值不能表示为Lambda表达式.

我哪里错了?

das*_*ght 8

问题是你的lambda表达式尝试使用循环返回"piecemeal"项,同时Select期望它立即返回整个事物.

您可以通过多种方式修复代码 - 例如,您可以将foreach循环转换为a 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()
            });
    });
Run Code Online (Sandbox Code Playgroud)

我想返回一个对象,例如Dictionary<string,List<object>>对象是纬度和经度

您可以像这样更改代码:

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);
Run Code Online (Sandbox Code Playgroud)