我正在创建一个包含逗号分隔值列表的字符串,但这些数值具有不同的格式。目前我正在使用这样的东西:
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执行此操作,事先创建与List<string>
类似的StringBuilder values
,但会更好吗?
有更优雅的方式吗?
注意:我是C#
的新手答案 0 :(得分: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 :(得分: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循环以外的任何其他处理。&#34; zip&#34;他们在一起。我建议在任何类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);
}
}
答案 2 :(得分: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())));