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

你的例子已经很简单了。一种选择是:

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