我正在研究linq并想知道linq是否可以在下面的场景中应用和使用;
假设我们将带有空格的字符串拆分为分隔符,并且如果项目不在列表中,则希望将拆分结果中的每个项目添加到列表中;
string text = "This is just a test!";
List<string> uniqueList = new List<string>();
foreach (string item in text.Split(' '))
{
if (!uniqueList.Contains(item))
{
uniqueList.Add(item);
}
}
使用linq我可以写(据我所知):
var items = from item in text.Split(' ')
where !uniqueList.ContainsKey(item)
select item;
items
现在是一个集合,我必须再次迭代它以将项目添加到uniqueList
。
linq是否有能力将第二次和第三次计算结合起来(不需要第二次迭代)或者我不能比第一次解决方案更好?
请注意,这只是一个示例, 广泛地考虑,也许下次我想为每个匹配的项目显示一个对话框而不是添加到列表中
答案 0 :(得分:2)
您可以使用:
string text = "This is just a test! is This aa";
var uniqueList = text.Split(' ').Distinct().ToList();
答案 1 :(得分:0)
uniqueList.AddRange(text.Split(' ').Where(s => !uniqueList.Contains(s)));
编辑(因为编辑了OP,表明向列表添加项目不是实际意图)
Linq执行查询并提供结果集。这不是关于使用结果作为参数执行代码。
对于它的价值,如果你的结果是List<T>
,你可以这样做:
myList.ForEach(itemInList => {
// Execute multiple statements using each item in the list
});
或
myList.ForEach(itemInList => DoSomethingWithItem(itemInList));
甚至更短,
myList.ForEach(DoSomethingWithItem);
但这只是为了方便。它与for...each
循环没有什么不同。
答案 2 :(得分:0)
是的,这可以通过Linq优雅地完成(并且更有效率,因为Contains
导致它为O(n ^ 2) - Distinct
Linq方法正好用于此目的) :
var uniqueList = text.Split(' ').Distinct().ToList();
答案 3 :(得分:0)
列表中元素的顺序是否重要?如果没有,您可以使用实现ISet的集合(如HashSet):
ISet<string> uniqueList = new HashSet<string>();
foreach (string item in text.Split(' '))
{
uniqueList.Add(item);
}
这使得集合可以决定是否需要添加项目(.Add将返回true,如果有的话)。它只是不保证按照添加它们的顺序进行枚举。我经常使用这些“它在那里吗?”一种测试。有点像没有价值的字典。
答案 4 :(得分:0)
如果您使用方法语法,则可以使用带范围的lambda表达式执行Select
,您可以在其中执行多个操作:
string text = "This is just a test ! test";
var uniqueList = new List<string>();
var items = text.Split(' ').Where(s => !uniqueList.Contains(s))
.Select(s=> {
uniqueList.Add(s);
return s;
})
.ToList();