Лямбда-выражение от Python до C # - PullRequest
0 голосов
/ 14 октября 2018

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

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

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

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();

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

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

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);
0 голосов
/ 14 октября 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...