2012-06-08 3 views
0

У меня есть зубчатый массив двойников, который мне нужно преобразовать в то, что я могу добавить в документ xml, а затем вернуться в массив с зубчатым контуром. Кто-нибудь знает, как это сделать? Заранее спасибо.Как преобразовать зубчатый двойной массив в строку и обратно?

public double[][] Coordinates { get; set; } 

//For context this is how I'm creating the array 

//convert the geography column back in lat\long points 
for (var g = 1; g <= geography.STNumGeometries(); g++) 
{ 
    var geo = geography.STGeometryN(g); 
    var points = new List<double[]>(); 
    for (var i = 1; i <= geo.STNumPoints(); i++) 
    { 
     var point = new double[2]; 
     var sp = geography.STPointN(i); 
     // we can safely round the lat/long to 5 decimal places 
     // as thats 1.11m at equator, reduces data transfered to client 
     point[0] = Math.Round((double) sp.Lat, 5); 
     point[1] = Math.Round((double) sp.Long, 5); 
     points.Add(point); 
    } 

    transitLineSegment.Coordinates = points.ToArray(); 
} 
+0

Каковы ваши требования? Должно ли это быть «XMLy»? Является ли одна строка для всего массива в порядке? Должно ли оно быть читаемым человеком? Сколько имеет значение размер результата? – svick

+0

@svick Не нужно быть XMLy. Я бы предпочел что-то, что является одной строкой, так как это будет внутри другого XML-документа. Не имеет значения, является ли это понятным для человека. Размер не имеет значения. – NullReference

ответ

3

Сила LINQ (код изменен на предложения в комментариях)

var doubleAR = new List<List<Double>>() 
{ 
    new List<double>(){ 12.5, 12.6, 12.7 }, 
    new List<double>(){ .06 }, 
    new List<double>(){ 1.0, 2.0 } 
}; 

    var asXml = new XElement("Data", 
          doubleAR.Select(sList => new XElement("Doubles", sList.Select (sl => new XElement("Double", sl)))) 
          ); 

    Console.WriteLine (asXml); 
/* Output 
<Data> 
    <Doubles> 
    <Double>12.5</Double> 
    <Double>12.6</Double> 
    <Double>12.7</Double> 
    </Doubles> 
    <Doubles> 
    <Double>0.06</Double> 
    </Doubles> 
    <Doubles> 
    <Double>1</Double> 
    <Double>2</Double> 
    </Doubles> 
</Data> */ 

// Then back 
    List<List<Double>> asDoubleArray = 
     XDocument.Parse(asXml.ToString()) 
        .Descendants("Doubles") 
        .Select (eDL => eDL.Descendants("Double") 
            .Select (dl => (double) dl)) 
             .ToList()) 
        .ToList(); 
+1

Я бы избавился от всего первого 'Select()'. Единственное, что он изменит, это то, что код не будет работать корректно с некоторыми настройками культуры (например, на моем компьютере он производит ' 12,5'). Содержимое «XElement» может быть «double», и оно правильно позаботится о форматировании. – svick

+1

И то же самое относится к вашему XML-синтаксическому коду: вы должны перевести весь элемент в 'double' (' dl => (double) dl'), который будет работать независимо от настроек культуры (если XML использует десятичную точку). – svick

+0

@svick Отличные предложения! Кодекс был изменен соответствующим образом; Я слишком сосредоточен на струнах, чтобы не учитывать культуру. – OmegaMan

Смежные вопросы