2012-06-18 43 views
2

在這種情況下,文本的來源是來自winforms文本框。我主要想要了解更多關於LINQ的知識,也許可以展示它的優勢(在我看來,它比循環更容易閱讀)。這個方案有幾個要求;該函數必須從文本框中獲取文本,將其分割爲單獨的行,刪除空行和/或重複行以及修剪行。這些是使用LINQ將幾個不同動作應用於字符串列表的最簡單方法嗎?

這些是唯一的方法嗎?在C#中是否還有其他方法(除了遍歷行列表並將符合標準的項目添加到新列表,數組等等之外)?

1:

List<String> listOne = textBoxWords.Text 
            .Split(new char [] { '\r', '\n' }) 
            .Select(s1 => s1.Trim()) 
            .Where(s2 => !String.IsNullOrEmpty(s2)) 
            .Distinct() 
            .ToList(); 

2:

List<String> listTwo = textBoxWords.Text 
            .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
            .Select(s1 => s1.Trim()) 
            .Distinct() 
            .ToList(); 

UPDATE:此代碼建議,但如果串不需要修剪纔有效。

3:

List<String> listThree = textBoxWords.Text 
            .Split(new char[] { '\r', '\n' }, 
            .Where(s1 => !String.IsNullOrWhiteSpace(s1)) 
            .Distinct() 
            .ToList(); 

我知道這是一個)相當具體,和b)很可能使用一個DataGrid來實現更容易,但代碼我保持器使用文本框和我沒有馬上要重寫它們。

+1

這些都看起來像完全合理的方式來做你想做的。 –

+0

@ThomSmith我添加了最後一個來演示另一個類似但不適合的版本(用於此程序),並展示了更簡單的LINQ的功能。來自Python背景(例如列表解析),這些都是相當不錯的功能。 –

+1

你可以使用一個Hashset來代替,它會稍微減少冗餘。 –

回答

2
var setOne = new HashSet<string>(textBoxWords.Text 
           .Split(new char [] { '\r', '\n' }) 
           .Select(s1 => s1.Trim()) 
           .Where(s2 => !String.IsNullOrEmpty(s2))); 

這是不完全一樣的,你有什麼,因爲結果是一個HashSet,而是根據你的情況這看起來可能是你正在試圖完成什麼更好的數據結構。

+0

我剛剛發表評論並要求提供代碼片段,因爲我正在考慮在[此問題](http://stackoverflow.com/a/3471927/869912)中使用接受的答案來編寫自定義擴展方法(儘管是一個非常簡單的),它將實現'ToHashedSet'。 –

+0

是不是代碼缺少類型聲明? 'var setOne = new HashSet (...)'而不是'var setOne = new HashSet(...)'?其實是的,如果我不包含類型聲明,我的編譯器會拋出一個錯誤。 –

+1

您的意思是HashSet ? –

1

你的例子已經相當簡單了。一種替代方案是:

(from s in textBoxWords.Split(new char[] { '\r', '\n' }) 
where !string.IsNullOrEmpty(s) 
select s.Trim()).Distinct(); 
相關問題