C# 拼接List中各对象里的字符串 增加ConvertAll和Select的区别
有不少都用到了拼接字符串,
我之前用循环拼字符串,有时候写起来很麻烦。现在查到这样一种写法,大家可以保留备用:
QueryUsers = String.Join(",", query.Users.ConvertAll(u => u.Code).ToArray())
String.Join(string separator, params string[] value);
第一个参数是连接符,而且只连接,不会在头尾加出多余的字符。
第二个参数是一个string类型的数组。
这里又先调用List的ConvertAll方法
List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter);
将query对象里的Users(是一个List<User>)全部转换为字符串。
这里又用到一个Lambda表达式:u => u.Code,意为取得所有对象的Code。
最后ToArray()成为字符串数组。
续:既然这里的Code是string类型,那根本不用ConvertAll,直接用Select即可。感谢xujif提醒。
当需要拼接的对象不是直接的string时,才适用Convert。比如
<span style="text-decoration: line-through;">QueryUsers = String.Join(",", query.Users.ConvertAll(u => u.ToString()).ToArray())</span>
再续:不求甚解的我还是正经的查了一下ConvertAll和Select的区别。
从来源说,Select是LINQ扩展方法之一,可以用于IEnumerable<>对象,从.Net 3.5开始引入;ConvertAll只在List<>中实现,从.Net 2.0开始。
此外,他们做的处理有些许不同,在不同的情况下有区别。
ConvertAll方法从原有List直接生成一个新的List;Select方法使用延迟执行,只在要用到时才处理项目。
也就是说如果你不需要全部的项目时,Select方法是更有效率的;另一方面,一但ConvertAll返回了List,你就可以不再保留原有的List了。
本文中数据类型为List,取出全部项目后立即拼接为字符串,这个情况下用ConvertAll是没有错的。
参考:http://stackoverflow.com/questions/1571819/difference-between-select-and-convertall-in-c-sharp