如何将Guid[]转换为字符串?

10

类似于 String.Join(",", new string[] { "a", "b" });,但针对的是 Guid[]

var guids = new Guid[] { Guid.Empty, Guid.Empty };

var str = /* Magic */

// str = 00000000-0000-0000-0000-000000000000,00000000-0000-0000-0000-000000000000
7个回答

25
var str = guids.Select(g => g.ToString())
               .Aggregate((working, next) => working + "," + next);

一旦您的GUID列表开始增长,这种连接方法会导致性能问题。 您可以修改它以使用 StringBuilder:

var str = guids.Select(g => g.ToString())
               .Aggregate(new StringBuilder(),
                          (sb, str) => sb.Append("," + str),
                          sb => sb.ToString());

这两种方式都是使用复杂的LINQ扩展方法完成的。您也可以简单地使用String.Join:

var str = String.Join(",", guids.Select(g => g.ToString()).ToArray());

我很好奇它与其他方法相比的速度有多快。我猜Aggregate不使用String.Concat来正确分配内存。 - Yuriy Faktorovich
1
@BrunoLM - 请记住,对于大量的Guid列表,您可能会遇到性能问题(大量字符串连接)。在这种情况下,您可能需要切换到StringBuilder方法(并手动删除最后一个逗号)。 - Justin Niessner
我会的,但是Stack Overflow有延迟,请耐心等待3分钟 :P - BrunoLM
1
@Yuriy Faktorovich - Aggregate会使用您指定的任何连接方法。 - Justin Niessner
@Justin Niessner:没错,但如果你只向String.Concat传递两个参数,它与+运算符相比不会有任何改进。我相信+运算符已经调用了String.Concat,但请不要引用我的话。 - Yuriy Faktorovich

22

.NET 4增加了一个String.Join<T>(string separator, IEnumerable<T> values)方法。因此,在.NET 4中,只需执行此操作即可:

String.Join(",", guids);

20
String.Join(",", guids.Select(g => g.ToString()).ToArray());

3
.NET 4增加了一个泛型的Join方法,您可以直接将guids数组传递给它,无需进行修改。 - thecoop

5
我觉得这个可以行吗?
StringBuilder stringBuilder = new StringBuilder();
int i = 0;
foreach (var guid in guids)
{
    stringBuilder.Append(guid.ToString());
    if (++i < guids.Length)
    { 
        stringBuilder.Append(","); 
    }
}

var str = stringBuilder.ToString();

你忘记 GUID 之间的逗号了 ;) - Oded
2
那会在末尾加上一个额外的逗号。 - Yuriy Faktorovich
好的,我尝试快速修复逗号问题。这还未经测试。希望它能正常工作 :-) - DaveDev
3
作为一个建议,如果stringbuilder.length > 0,我会在追加guid之前追加逗号。 - Nathan Koop

1

如果你的框架版本>= .NET 3.5


String.Join(",", (from g in guids select g.ToString()).ToArray())

1
String.Join(",", Array.ConvertAll(guids, g => g.ToString()));

这个语句似乎无法在VS2010中通过编译? - Thomson
Array.ConvertAll 需要一个实现了 Converter<TInput, TOutput> 接口的类,而你传递了一个方法。 - Yuriy Faktorovich

0
//Convert string to List<string>    
List<string> guidList = your_string.Split(',').ToList<string>();

//Convert string to List<Guid>    
List<Guid> guidList = your_string.Split(',').ToList<string>().ConvertAll<Guid>(g => new Guid(g));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接