2011-04-26 42 views
2

我试图解决方案放在一起: Insert spaces between words on a camel-cased token字符替换在LINQ中?

本质上说,他希望把“ThisIsATest”到“这是一个测试”。我想,'哦,这很容易,我可以用LINQ来做,但我努力。

有人可以帮助我吗?

Dim s As String = String.Join("", From myChar As Char In myStr _ 
            Select If(Char.IsUpper(myChar), (" " & myChar).ToString, myChar.ToString)) 

是我开始走下去的路径,但我无法将结果导入我可以使用的东西。我甚至添加了.ToString来尝试获取一个字符串数组,但是我仍然收到一个错误。

无法转换 类型的对象 'WhereSelectEnumerableIterator`2 [System.Char,System.String]' 为类型 'System.String []'。

我相信这意味着我得到System.Char,System.String而不是像我想要的System.String的集合。

我在做什么错?

+0

你的问题是与http://stackoverflow.com/questions/323314/best-way-to-convert-pascal-case-to-a-句子相关。有很多不同的选择来解决你的问题。 – alex 2011-04-26 21:35:10

+0

谢谢大家。看到它正确完成,这是有道理的。 – 2011-04-26 21:44:34

回答

2

您需要将第二个参数转换为String []。您可以使用.ToArray()

Dim outStr As String = String.Join("", (From myChar As Char In myStr _ 
               Select If(Char.IsUpper(myChar), (" " & myChar).ToString, myChar.ToString)).ToArray()) 
+1

您在测试字符串前有一个空格。 – IAbstract 2011-04-26 21:49:47

+1

@IAbstract - 我的计划是要把整件事情都拿走,而不是试图处理大写字母的边缘情况。但你是100%正确的。 – 2011-04-26 21:50:50

1

C#:

var myStr = "TestString"; 
var outStr = string.Concat(myStr.Select(c => char.IsUpper(c) ? " " + c : c.ToString())); 

自动转换到VB.NET:

Dim myStr = "TestString" 
Dim outStr = String.Concat(myStr.[Select](Function(c) If(Char.IsUpper(c), " " & Convert.ToString(c), c.ToString()))) 
+1

我没有看过C#解决方案,但VB.Net解决方案正在返回:System.Linq.Enumerable + WhereSelectEnumerableIterator'2 [System.Char,System.String ] – IAbstract 2011-04-26 21:51:11

5

您可以在大写字符使用正则表达式和分裂。

Dim myString as string = "ThisIsATest" 
Dim outStr As String = Regex.Replace(myString,"[A-Z]"," $0") 

区分大小写的replace将定位每个大写字符并在字符前插入一个空格。

+0

+1:虽然不是LINQ,但这是一个更干净。为了便于阅读,我将采用LINQ解决方案。 – IAbstract 2011-04-26 21:48:39

+0

如果一封信已经在前面有空格了? – 2011-04-26 22:18:53

+0

@Chuck Savage - 这是一个很好的问题。这取决于目的是什么,在实施过程中绝对需要考虑。 – Leons 2011-04-26 22:52:13