最有效的具有格式化功能的 Dictionary.ToString() ?
将字典转换为格式化字符串的最有效方法是什么。
例如:
我的方法:
public string DictToString(Dictionary<string, string> items, string format){
format = String.IsNullOrEmpty(format) ? "{0}='{1}' " : format;
string itemString = "";
foreach(var item in items){
itemString = itemString + String.Format(format,item.Key,item.Value);
}
return itemString;
}
有更好/更简洁/更有效的方法吗?
注意:字典最多有 10 个项目,如果存在另一个类似的“键值对”对象类型,我不会承诺使用它
此外,由于我无论如何都返回字符串,所以会发生什么通用版本是什么样的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我刚刚重写了您的版本,使其更加通用并使用
StringBuilder
:I just rewrote your version to be a bit more generic and use
StringBuilder
:此方法的
使用方式如下:
将转换
为
或
to
不要忘记重载:
您可以使用通用
TKey
/TValue
因为任何对象都有ToString()< /code> 将由
String.Format()
使用。至于
IDictionary
是IEnumerable>
您可以使用任何一个。我更喜欢 IDictionary,因为它具有更多的代码表现力。This method
used next way:
will convert
to
or
to
Don't forget an overload:
You can use generic
TKey
/TValue
because any object hasToString()
which will be used byString.Format()
.And as far as
IDictionary<TKey, TValue>
isIEnumerable<KeyValuePair<TKey, TValue>>
you can use any. I prefer IDictionary for more code expressiveness.其他答案的略微改进版本,使用扩展方法和默认参数,并将键/值对包装在 {} 中:
然后可以直接从字典/枚举调用该方法:
Sligtly improved version of the other answers, using extension methods and default parameters, and also wrapping key/value pairs in {}:
The method can then be called directly from the dictionary/enumerable:
使用 Linq 和 string.Join() (C# 6.0) 将字典格式化为一行:
您可以创建简单的扩展方法,如下所示:
Format dictionary in one line with Linq and string.Join() (C# 6.0):
You can create simple extension method like this:
我认为对于只有 10 个字符串,效率几乎不是问题,但也许您不想依赖它只有 10 个。
字符串的串联会在内存中创建一个新的 String 对象,因为 String 对象是不可变的。这也表明其他字符串操作可能会创建新实例,例如替换。通常使用 StringBuilder 可以避免这种情况。
StringBuilder 通过使用它所操作的缓冲区来避免这种情况;当 StringBuilder 的值与另一个 String 连接时,内容将添加到缓冲区的末尾。
不过,也有一些注意事项,请参阅本段:
因此,像这样的(人为的)情况可能不应该被替换为 StringBuilder:
...因为编译器可能能够将其简化为更有效的形式。如果它的效率低到足以在更大的计划中发挥重要作用,也是非常有争议的。
按照 Microsoft 的建议,您可能想改用 StringBuilder (就像其他非常充分的答案所示)。
I think efficiency is hardly a concern with only 10 strings, but maybe you don't want to rely on it only being ten.
Concatenation of Strings creates a new String object in memory, since String objects are immutable. This also suggest other String operations may create new instances, like replace. Usually this is avoided by using StringBuilder.
StringBuilder avoids this by using a buffer which it operates on; when the value of the StringBuilder is concatenated with another String the contents are added to the end of the buffer.
However there are caveats, see this paragraph:
So a (contrived) case like this should probably not be replaced with StringBuilder:
...as the compiler might be able to reduce this to a more efficient form. It is also highly debatable if it would inefficient enough to matter in the greater scheme of things.
Following Microsoft's recommendations you probably want to use StringBuilder instead (like the other highly adequate answers show.)
加布,如果你想变得通用,那就通用吧:
Gabe, if you are going to be generic, be generic: