2014-09-04 55 views
1

我使用逗號分隔值列表創建了一個字符串,但這些數字值具有不同的格式。目前我使用的是這樣的:從多個格式的數值中創建逗號分隔的字符串

var values = new StringBuilder(); 
// These are all of type double 
values.AppendFormat("{0:F1},", aLength); 
values.AppendFormat("{0:F4},", anAngle); 
values.AppendFormat("{0:F1},", aHeight); 
values.AppendFormat("{0:F2},{1:F2},", a2DPoint.X, a2DPoint.Y); 
// while these are all of type int 
values.Append(anID).Append(","); 
values.Append(anInt).Append(","); 
values.Append(anotherInt); 
if (aListOfInt.Count > 0) 
{ 
    values.Append(","); 
    values.Append(String.Join(",", aListOfInt)); 
} 

var resultString = values.ToString(); 

這是正確的方法嗎?我也可以用String.Join這樣做,事先創建一個類似於上面的StringBuilder valuesList<string>,但是會更好嗎? 有沒有更優雅的方式?

注:我是新來的C#

+6

使用了逗號分隔的字符串十進制數字是一個壞主意 - 有很多文化在他們的數字中使用逗號,這是造成問題的常見原因。例如,可以使用逗號來分隔數千個,甚至是小數點。當轉換成字符串和字符串時,至少使用'CultureInfo.InvariantCulture',否則你剛剛破壞了你的應用程序半個星球:) – Luaan 2014-09-04 07:28:01

+0

@Luaan啊,這是一個很好的觀點。在這種特殊情況下,這是正在寫入文件的信息,用於與舊系統的向後兼容,而舊系統甚至用不同的語言編寫。我們正試圖改變事情的方式。但是你的評論是我們應該考慮的事情。感謝那。 – alondono 2014-09-04 11:03:09

+2

我認爲最好的實現方法是爲每個度量單位(即長度,角度,點)創建一個類並覆蓋它們的ToString方法,並讓多態性爲您工作。至於加入這些值,string.Join是最乾淨的選項。 – brz 2014-09-04 18:41:27

回答

0

我覺得這確實是相當不錯:

var resultString = String.Join(",", new [] 
{ 
    aLength.ToString("F1"), 
    anAngle.ToString("F4"), 
    aHeight.ToString("F1"), 
    a2DPoint.X.ToString("F2"), 
    a2DPoint.Y.ToString("F2"), 
    anID.ToString(), 
    anInt.ToString(), 
    anotherInt.ToString(), 
}.Concat(aListOfInt.Select(x => x.ToString()))); 
0

試試這個:

var objList = new List<object>(); 
objList.Add(1); 
objList.Add(2.0); 
... 
var resultString = string.Join(",", objList.Cast<string>()); 

把自己的價值觀對象的列表,施放值的字符串,並加入值。

但與上述你將失去你的格式。 我有另一種解決方案。我認爲這是沒有鬆動的每個值的格式很短的語法:

var stringList = new List<string>{ 
    aLength.ToString("F1"), 
    anAngle.ToString("F4"), 
    ... 
}; 
var resultString = string.Join(",", stringList); 
+1

這對於不同格式的值有什麼幫助?即有些人用'F2''別人用'F2'還有其他人用'F4'等等? – Corak 2014-09-04 07:41:06

+0

請參閱第二節。我在同一時間看到了我的錯誤。首先我想你是指double和int的混合。 – 2014-09-04 07:49:02

+0

@MathiasMüller你的第二部分是我說的「我也可以用'String.Join'來做到這一點」,而不是建立一個'StringBuilder'列表,建立一個'List '並使用'String.Join '。但是這比我上面做的更好嗎?由於我是C#的新手,我一直對所有這些問題持懷疑態度 - 更多的C#類,更優雅,更高效。 – alondono 2014-09-04 11:20:36

0

如果你在尋找什麼是更優雅(而不是最優的),你可以嘗試這樣的事:

//Note the commas in the formats,and that formats and data have the same size. 
List<string> formats = new List<string>(new string[] {"{0:F1},", "{0:F4},", "{0:F2},",{0}}); 
List<object> data=new List<object>(new object[]{4,2,0.12,new object()}); 
StringBuilder resultBuilder=new StringBuilder(); 
for (int i = 0; i < 4; i++) { 
     resultBuilder.AppendFormat(formats[i], data[i]); 
} 
string result = resultBuilder.ToString(); 

只要您對如何設置格式和數據非常小心,除了for循環之外,您無需執行任何其他處理即可將它們「壓縮」在一起。我建議在任何a2DPoint類上重寫ToString(),這樣你就可以將它放到一個單獨的格式塊中,而不需要特殊的處理,或者將a2DPoint.X和a2DPoint.Y拆分成單獨的數據/格式塊。不過,這不是最有效的方法。列表佔用了空間和時間;如果你提前知道你會有多少條目,陣列可能會更好。

編輯:在註釋方法的實施 編輯:添加例子方法的評論稱:

public class FormatZipper { 
    //This could be two lists, but it's probably more space/time efficent to use a single list. 
    List<Tuple<string,object>> _entries; 
    StringBuilder _builder; 
    public FormatZipper() { 
     _builder = new StringBuilder(); 
     _entries = new List<Tuple<string, object>>(); 
    } 
    public void AddEntry(string fmt, object data) { 
     _entries.Add(Tuple.Create(fmt, data)); 
    } 

    public string CurrentString { 
     get { 
      _builder.Clear(); 
      foreach (var entry in _entries) { 
       _builder.AppendFormat(entry.Item1, entry.Item2); 
      } 
      return _builder.ToString(); 
     } 
    } 
} 
class Program { 
    static void Main(string[] args) { 
     FormatZipper zipper = new FormatZipper(); 
     zipper.AddEntry("{0:F1},", 1); 
     Console.WriteLine(zipper.CurrentString); 
     zipper.AddEntry("{0:F2,", 1); 
     Console.WriteLine(zipper.CurrentString); 


    } 
} 
+1

儘管看起來很有趣,但這個解決方案的問題在於,正如您所說的,您需要非常小心地設置格式和數據,否則很容易導致不匹配。 – alondono 2014-09-04 11:11:28

+0

您可以通過將兩個列表翹曲成只允許同時添加值和格式的單個類(即formatZipper.AddField(string fmt,object data))來解決此問題。然後,您可以通過覆蓋ToString()或提供某種方法或屬性來運行for循環。這樣做有更復雜的方法,但他們需要更多關於具體細節的知識。 – Benjamin 2014-09-04 17:02:11

+0

我很欣賞你的努力,但是它開始看起來有點複雜嗎?無論如何,我喜歡你對這兩個列表的想法。 – alondono 2014-09-05 01:12:57