Я пытаюсь переписать что-то с 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();
вы можете дублировать этот питон, используя:
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);
Мы можем сделать это с помощью:
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).
OrderedEnumerable
. Я всегда предполагал, что OrderBy
выполняет полную сортировку.
.First()
обычно должен работать за линейное время.