在这种情况下,文本来源来自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更容易实现,但我维护的代码使用文本框,我没有立即想要重写它们。
答案 0 :(得分:2)
var setOne = new HashSet<string>(textBoxWords.Text
.Split(new char [] { '\r', '\n' })
.Select(s1 => s1.Trim())
.Where(s2 => !String.IsNullOrEmpty(s2)));
由于结果是HashSet,它与你所拥有的不完全相同,但根据你的场景,它看起来可能是你想要完成的更好的数据结构。
答案 1 :(得分:1)
您的示例已经非常简单了。一种选择是:
(from s in textBoxWords.Split(new char[] { '\r', '\n' })
where !string.IsNullOrEmpty(s)
select s.Trim()).Distinct();