2

この場合、テキストのソースはwinformsテキストボックスからのものです。私はこれを主に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();

更新:このコードが提案されましたが、文字列をトリミングする必要がない場合にのみ機能します。

3:

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

私はそれがa)かなり具体的であり、b)DataGridを使用しておそらくより簡単に実装できることを知っていますが、私が維持しているコードはテキストボックスを使用しており、すぐに書き直したくありませんでした。

4

2 に答える 2

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

結果がHashSetであるため、これはあなたが持っているものとまったく同じではありませんが、シナリオに基づいて、それはあなたが達成しようとしていることのためのより良いデータ構造であるように見えます。

于 2012-06-18T16:21:17.973 に答える
1

あなたの例はすでにかなり単純です。1つの選択肢は次のとおりです。

(from s in textBoxWords.Split(new char[] { '\r', '\n' })
where !string.IsNullOrEmpty(s)
select s.Trim()).Distinct();
于 2012-06-18T16:37:37.047 に答える