C# 从列表返回字符串的最优雅方式<;int>;
从列表中返回字符串最优雅的方式是什么 好的,是的,我知道我可以做一些C# 从列表返回字符串的最优雅方式<;int>;,c#,C#,从列表中返回字符串最优雅的方式是什么 好的,是的,我知道我可以做一些 public string Convert(List<int> something) { var s = new StringBuilder(); foreach(int i in something) s.AppendFormat("{0} ", i); return s.ToString(); } 公共字符串转换(列出某些内容) { var s=新的StringBui
public string Convert(List<int> something)
{
var s = new StringBuilder();
foreach(int i in something)
s.AppendFormat("{0} ", i);
return s.ToString();
}
公共字符串转换(列出某些内容)
{
var s=新的StringBuilder();
foreach(inti在某物中)
s、 附录格式(“{0}”,i);
返回s.ToString();
}
但我相信有一种方法可以做到这一点
我还尝试附加到stringbuilder,但这并没有达到预期效果
String result = String.Join(" ", list.Select(item => item.ToString()).ToArray());
如果它只是类型List
(而不是List
)的集合,则只能有0而不是空值
但是为了解决假设的或更一般的null
问题,可以添加其中(item=>item!=null)
,使用条件运算符或null合并运算符。但是,添加到表达式中的每个“修复”都会降低其可读性和优雅性。使用字符串。连接:
string.Join(" ", something.Select(i => i.ToString()).ToArray())
使用LINQ并累积:
string res = list.Select(x => x.ToString()).Aggregate("", (a,b) => a + " " + b);
并保存一个中间数组(但对于一个大的列表,会创建O(n)个垃圾字符串)。IMO,您最好使用原始版本;LINQ很棒,但它并不是所有问题的答案。特别是
string.Join
方法需要额外的数组(增益很小),而Aggregate
方法使用中间字符串的lots
不过,或许可以将其作为一种扩展方法,并丢掉格式
的东西:
public static string Concatenate<T>(this IEnumerable<T> source, string delimiter)
{
var s= new StringBuilder();
bool first = true;
foreach(T t in source) {
if(first) {
first = false;
} else {
s.Append(delimiter);
}
s.Append(t);
}
return s.ToString();
}
公共静态字符串连接(此IEnumerable源,字符串分隔符)
{
var s=新的StringBuilder();
bool first=true;
foreach(源中的T){
如果(第一){
第一个=假;
}否则{
s、 附加(分隔符);
}
s、 附加(t);
}
返回s.ToString();
}
另一种扩展方法:
public static class Extensions {
public static string Join(this List<int> list) {
return string.Join(" ", list.Select(item => item.ToString()).ToArray());
}
}
公共静态类扩展{
公共静态字符串联接(此列表){
返回string.Join(“,list.Select(item=>item.ToString()).ToArray());
}
}
用法:
string s = new List<int> {1, 2, 3}.Join();
string s=新列表{1,2,3}.Join();
利用StringBuilder和LINQ:
public static string SpaceOut(this IEnumerable<int> list)
{
if (list.Count()==)) return string.Empty;
var res = new StringBuilder();
list.Take(list.Count() - 1).ToList().ForEach(i => res.Append(i.ToString() + " "));
res.Append(list.Last().ToString());
return res.ToString();
}
公共静态字符串SpaceOut(此IEnumerable列表)
{
if(list.Count()==)返回string.Empty;
var res=新的StringBuilder();
list.Take(list.Count()-1.ToList().ForEach(i=>res.Append(i.ToString()+));
res.Append(list.Last().ToString());
return res.ToString();
}
使用字符串。加入:
List<int> data = ..;
var result = string.Join(";", data); // (.NET 4.0 only)
var result = string.Join(";", data.Select(x => x.ToString()).ToArray()); // (.NET 3.5)
列表数据=。。;
var result=string.Join(“;”,data);//(仅限.NET 4.0)
var result=string.Join(“;”,data.Select(x=>x.ToString()).ToArray());//(.NET 3.5)
您需要将i
转换为lambda中的字符串;这是C#的意思。对不起,这有多优雅?仅仅因为它是新的,Linq'y并不意味着它自动优雅。顺便说一句,我很喜欢使用Linq,但不是所有的东西都使用。这可能很重要。Aggregate+stringbuilder可能会更好。它有点优雅,因为它简单紧凑。这显然不是最好或最有效的解决方案。我完全忽略了null问题。它也很“优雅”,因为它使用了现有的字符串。Join()。这一事实立即向未来的读者传达了许多你自己的循环方法所不能传达的信息。艾森泰因没有说过优雅吗?我不记得这是为了什么!“如果你想描述真相,就把优雅留给裁缝吧。”这很有趣;如果.NET提供了一个名为ListToString的内置函数,并且有人发布了答案,“只需使用ListToString”,那么每个人都会称之为优雅。但是如果有人写了一个函数,在内部做了完全相同的事情,只要看到代码,人们就会称之为笨拙。林克看起来很简洁,但这并不意味着封面下没有太多内容。@Dan-说得好。事实上,LINQ的大部分内容都是关于隐藏复杂性——当然,复杂性仍然存在-p、 你所说的“聚合”方法是什么意思,LINQ?人们会称之为笨拙,因为这些低级技巧很笨拙。这就是为什么我们有LINQ等。如果我们想一直处理这样的决策,而不是在特殊情况下很少处理这样的决策,我们可能会使用一种在VM上不作为字节码运行的语言。在99%的应用程序中,使用LINQ方法更具可读性、可维护性,而且很多时候它可能比您自己编写的还要快。
List<int> data = ..;
var result = string.Join(";", data); // (.NET 4.0 only)
var result = string.Join(";", data.Select(x => x.ToString()).ToArray()); // (.NET 3.5)