Лямбда-выражение от Python до C #

1

Я пытаюсь переписать что-то с python на С#, мне удалось воссоздать словари, но у меня возникли проблемы с пониманием понимания словаря в С#. вот код python, который я хотел бы воссоздать в С#

distances={1:.02,30:.001,1000:.001}
minSearch=(min(distances.items(), key=lambda x:x[1]))

это словарь, который я имею в С#

Dictionary<int, double> distDict = new Dictionary<int, double>();

Спасибо, что ответ здесь реализован

                List<MapPoint> list = new List<MapPoint>();
                list.Add(pointDict[Convert.ToInt32(startOid)]);
                while (pointDict.Count()>1)
                {
                    var shape = pointDict[Convert.ToInt32(startOid)];
                    pointDict.Remove(Convert.ToInt32(startOid));
                    var X = shape.X;
                    var Y = shape.Y;
                    var Z = shape.Z;
                    foreach(KeyValuePair<int,MapPoint> point in pointDict)
                    {
                        var X2 = point.Value.X;
                        var Y2 = point.Value.Y;
                        var Z2 = point.Value.Z;
                        var squaredZDist = Math.Pow((Z - Z2), 2);
                        var squaredDist = Math.Pow(Math.Sqrt(Math.Pow(X - X2, 2) + Math.Pow(Y - Y2, 2)),2);
                        var threeDSquaredDist = Math.Sqrt(squaredDist + squaredZDist);
                        distDict[point.Key] = threeDSquaredDist;
                    }
                    var minValue = distDict.Min(x => x.Value);
                    var minPair = distDict
                                    .Where(x => x.Value == minValue)
                                    .First();
                    startOid = minPair.Key;
                    list.Add(pointDict[minPair.Key]);

                    distDict.Clear();
                }
                Polyline polyline = PolylineBuilder.CreatePolyline(list);
                var pipeLayer = mapView.Map.Layers.OfType<FeatureLayer>()
                                                    .Where(x=>x.Name == "PIPELINE")
                                                    .First();
                MessageBox.Show(pipeLayer.Name.ToString());
                var createFeatures = new EditOperation();
                createFeatures.Name = "Create Polyline";
                createFeatures.Create(pipeLayer, polyline);
                createFeatures.Execute();
Теги:
dictionary
lambda

2 ответа

1
Лучший ответ

вы можете дублировать этот питон, используя:

var distDict = new Dictionary<int, double> {
  {1,.02},{30,.001},{1000,.001}
};
var minValue = distDict.Min(x => x.Value);
var minPair = distDict
                .Where(x => x.Value == minValue)
                .First();
var expected = new KeyValuePair<int, double>(30, .001);
Assert.Equal(expected, minPair);
  • 1
    Ответ сработал отлично. Большое спасибо. Я разместил реализацию выше в вопросе.
1

Мы можем сделать это с помощью:

KeyValuePair<int, double> minSearch = distDict.OrderBy(x => x.Value).First()

Таким образом, KeyValuePair<int, double> который содержит свойство Key и Value словарной записи с наименьшим Value в словаре.

С# не будет немедленно заказывать коллекцию с .OrderBy(..), но построить OrderedEnumerable [GitHub]. Это, как правило, приводит к тому, что .First() будет стремиться вычислять наименьший элемент в линейном времени, поэтому O (n) и, как @flakes, говорят о постоянной сложности памяти O (1).

  • 0
    Здорово! Я никогда не знал, что о OrderedEnumerable . Я всегда предполагал, что OrderBy выполняет полную сортировку.
  • 0
    @flakes: ну, конечно, если вы перечислите элементы, он в конечном итоге выполнит полную сортировку, но .First() обычно должен работать за линейное время.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню