从IList<string>或IEnumerable<string>创建逗号分隔的字符串值列表的最干净的方法是什么?

string . join(…)操作在字符串[]上,因此当IList<string>或IEnumerable<string>等类型不能轻松转换为字符串数组时,处理起来很麻烦。


当前回答

使用. net 3.5中的Linq扩展,可以很容易地将它们转换为数组。

   var stringArray = stringList.ToArray();

其他回答

在阅读本文之前,我刚刚解决了这个问题。我的解决方案如下:

   private static string GetSeparator<T>(IList<T> list, T item)
   {
       return (list.IndexOf(item) == list.Count - 1) ? "" : ", ";
   }

被称为:

List<thing> myThings;
string tidyString;

foreach (var thing in myThings)
{
     tidyString += string.format("Thing {0} is a {1}", thing.id, thing.name) + GetSeparator(myThings, thing);
}

我也可以这样简单地表达,也会更有效率:

string.Join(“,”, myThings.Select(t => string.format(“Thing {0} is a {1}”, t.id, t.name)); 

由于我在搜索对象列表的特定属性(而不是ToString())时到达这里,这里是对接受的答案的补充:

var commaDelimited = string.Join(",", students.Where(i => i.Category == studentCategory)
                                 .Select(i => i.FirstName));

有点难看,但很管用:

string divisionsCSV = String.Join(",", ((List<IDivisionView>)divisions).ConvertAll<string>(d => d.DivisionID.ToString("b")).ToArray());

在您给它转换器之后,从列表中给您一个CSV(在本例中d => d.DivisionID.ToString("b"))。

Hacky但工作-可以成为一个扩展方法也许?

.NET 4 +。

IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);

Detail & Pre .Net 4.0解决方案

IEnumerable<string>可以很容易地用LINQ转换成一个字符串数组。NET 3.5):

IEnumerable<string> strings = ...;
string[] array = strings.ToArray();

如果你需要,编写等效的helper方法很容易:

public static T[] ToArray(IEnumerable<T> source)
{
    return new List<T>(source).ToArray();
}

然后这样称呼它:

IEnumerable<string> strings = ...;
string[] array = Helpers.ToArray(strings);

然后你可以调用string.Join。当然,你不需要使用helper方法:

// C# 3 and .NET 3.5 way:
string joined = string.Join(",", strings.ToArray());
// C# 2 and .NET 2.0 way:
string joined = string.Join(",", new List<string>(strings).ToArray());

后者有点拗口:)

这可能是最简单的方法,而且性能也很好——关于性能究竟是什么样的,还有其他问题,包括(但不限于)这个问题。

从。net 4.0开始,字符串中有更多的重载可用。加入,你可以这样写

string joined = string.Join(",", strings);

简单多了:)

你可以在列表和IEnumerables上使用. toarray(),然后根据需要使用String.Join()。