2011-05-21 73 views
20

LINQ到對象支持在查詢的字符串對象,但是當我使用如下代碼如下:如何對一個字符串進行`.Take()`並在最後得到一個字符串?

string SomeText = "this is some text in a string"; 
return SomeText.Take(6).ToString(); 

我得到的是:

System.Linq.Enumerable+<TakeIterator>d__3a`1[System.Char] 

這是作爲一個「意外」在this question討論,但本是我實際上想要做的事情,我無法通過任何地方搜索找到它。

我知道還有其他方法來操作字符串,但是我也知道你可以用LINQ做一些非常酷的技巧,我只是想知道是否有一種方法可以將字符串修剪成一定長度的LINQ?

回答

18

有沒有內置在System.Linq的做到這一點的方法,但你可以很容易編寫自己的擴展方法:

public static class StringExtensions 
{ 
    public static string ToSystemString(this IEnumerable<char> source) 
    { 
     return new string(source.ToArray()); 
    } 
} 

不幸的是,因爲存在於所有.NET對象object.ToString,你就必須給該方法一個不同的名稱,以便編譯器將調用你的擴展方法,而不是內置的ToString

根據以下您的評論,最好質疑這是否是正確的做法。由於String暴露了很多的功能,通過它的公共方法,我會實現這個方法的擴展上String本身:

string SomeText = "this is some text in a string"; 
return SomeText.Truncate(6); 

這樣做的好處是:

/// <summary> 
/// Truncates a string to a maximum length. 
/// </summary> 
/// <param name="value">The string to truncate.</param> 
/// <param name="length">The maximum length of the returned string.</param> 
/// <returns>The input string, truncated to <paramref name="length"/> characters.</returns> 
public static string Truncate(this string value, int length) 
{ 
    if (value == null) 
     throw new ArgumentNullException("value"); 
    return value.Length <= length ? value : value.Substring(0, length); 
} 

你會像下面這樣使用它當字符串已經小於所需長度時,不會創建任何臨時數組/對象。

+0

謝謝。這是一個「好」的方式來做事情?它是一個大型系統的一部分,我在這裏傳遞一個StringBuilder和'.Append()'來生成一個文件。我知道我不應該過早地進行優化,但是如果有一種更簡單的方法來做到這一點,那麼您正在使用LINQ來建議浪費大量的CPU /內存。簡單來說:你會使用這段代碼在你自己的項目中修改一個字符串到一定的長度嗎? – rtpHarry 2011-05-21 18:54:54

+1

@rtpHarry好問題;我個人不會使用LINQ來完成這個任務,並用我選擇的方法更新了我的答案。 – 2011-05-21 19:18:30

+0

感謝您的額外反饋,我將根據此更新我的代碼:) – rtpHarry 2011-05-21 19:52:06

15

剛剛創建的字符串

string res = new string(SomeText.Take(6).ToArray()); 

還要注意字符串的本地方法

string res = SomeText.Substring(0, 6); 
+1

如果'SomeText'少於6個字符,則子字符串將拋出;我假定OP想要一個像Take一樣的方法(即,最多返回多個字符,但是如果輸入字符串更短,則返回更少(無一例外))。 – 2011-05-21 19:19:41

3

SomeText.Take(6)將返回字符的字符的IEnumerable,並ToString方法將不會返回您需要將涉嫌串請撥打電話:

string [] array = SomeText.Take(6).ToArray(); 
string result = new string(array); 
6

我碰到過幾次,並使用以下內容:

string.Join(string.Empty,yourString.Take(5)); 
相關問題