2011-04-26 61 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