从具有多种格式的数值创建逗号分隔的字符串

本文关键字:创建 分隔 字符串 格式 | 更新日期: 2023-09-27 18:20:32

我正在创建一个包含逗号分隔值列表的字符串,但这些数值有不同的格式。目前我正在使用这样的东西:

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#的新手

从具有多种格式的数值创建逗号分隔的字符串

我认为这做得很好:

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

试试这个:

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

如果你想要的是更优雅的(而不是最优的),你可以尝试这样的东西:

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

    }
}