2013-12-16 107 views

回答

2

如果沒有迭代,你無法做到這一點。所有你能做的就是隱藏的方法迭代(或使用包含一個迭代一個現成的方法):

private IEnumerable<char> AllChars() 
{ 
    // using the same loop header as the example here: 
    for (int ctr = Convert.ToInt32(char.MinValue); ctr <= Convert.ToInt32(char.MaxValue); ctr++) { 
     yield return (char)ctr; 
    } 
} 

在該方法中,你可以再使用LINQ functions from the Enumerable class只提取所有字符的一個子集:

char[] separatorChars = AllChars().Where(char.IsSeparator).ToArray(); 

Where extension method列舉了只有原來的枚舉與條件符合的這些項目 - 作爲char.IsSeparator method這裏提供。

然後通過ToArray method將全部字符集中的如此選擇的子集轉換成數組。

4

我不知道你爲什麼不喜歡MSDN環路,這裏是LINQ相同的( 「循環」):

int charMin = Convert.ToInt32(Char.MinValue); 
int charMax = Convert.ToInt32(Char.MaxValue); 
List<char> separatorChars = Enumerable.Range(charMin, charMax - charMin + 1) 
    .Select(i => (Char)i) 
    .Where(Char.IsSeparator) 
    .ToList(); 

Demo

\u0020 (SpaceSeparator) 
\u00A0 (SpaceSeparator) 
\u1680 (SpaceSeparator) 
\u2000 (SpaceSeparator) 
\u2001 (SpaceSeparator) 
\u2002 (SpaceSeparator) 
\u2003 (SpaceSeparator) 
\u2004 (SpaceSeparator) 
\u2005 (SpaceSeparator) 
\u2006 (SpaceSeparator) 
\u2007 (SpaceSeparator) 
\u2008 (SpaceSeparator) 
\u2009 (SpaceSeparator) 
\u200A (SpaceSeparator) 
\u200B (SpaceSeparator) 
\u2028 (LineSeparator) 
\u2029 (ParagraphSeparator) 
\u202F (SpaceSeparator) 
\u3000 (SpaceSeparator) 
+0

在我看來,這個清單應該已經準備好了。 而你需要調用一個函數;) – Mixer

+3

@Mixer:該函數不存在。被調用的實際代碼位於'CharUnicodeInfo'類中,並使用指針和其他「不安全」方法獲取該unicode值的類別。沒有任何方便存儲的東西的清單,然後檢查。如果你需要一個單一的列表,然後使用上述方法之一(或個人,我會去的MSDN之一)。對我來說,它幾乎立即返回,如果你使用它很多,你可以將它固定在某個地方。如果你擔心效率,那麼在擔心之前先考慮基準。我懷疑你沒有問題。 – Chris