[英]Optimize Linq in C#
我有列列表,我需要将除了两列的Isselected指定为true。 (错误和功能)。 我已经使用以下代码来实现它并且工作正常,但有没有快速或简单的方法来实现相同的目标?
DisplayColumns.ToList().ForEach(a => a.IsSelected = true);
DisplayColumns.ToList().Where(a => a.ColumnName == "Bug" || a.ColumnName == "Feature").ToList().ForEach(a => a.IsSelected = false);
提前致谢
我已经使用以下代码来实现它并且工作正常,但有没有快速或简单的方法来实现相同的目标?
在我看来,有一种更清晰的方法来实现它 - 只是不要使用lambdas等:
foreach (var item in DisplayColumns)
{
item.IsSelected = item.ColumnName != "Bug" && item.ColumnName != "Feature";
}
您可以一次性做出决定 - 如果列名称是“bug”或“feature”,则为false
; 否则就是true
。 当C#语言具有非常好的foreach
循环结构时,您不需要调用ToList
并使用ForEach
,以便在使用集合中的每个项目时执行某些代码。
我喜欢LINQ - 这太棒了 - 但它的最佳点是查询 (因此是Q)而不是操纵。 在这种情况下,只有ToList
部分甚至是LINQ - List<T>.ForEach
一部分。在LINQ之前,.NET 2.0中引入了.ForEach。
当然,您可以立即分配IsSelected
。
DisplayColumns.ToList().ForEach(a => a.IsSelected = !(a.ColumnName == "Bug" || a.ColumnName == "Feature"));
如果DisplayColumns
不是匿名类型的投影(在这种情况下属性不可重新分配),您将能够通过集合在单次迭代迭代中更改标志。
您还可以使用Contains
来简化比较。 在课堂范围:
private static readonly string[] _searches = new [] {"Bug", "Feature"}
在你的方法中:
DisplayColumns
.ToList() // For List.ForEach, although not @JonSkeet's caveat re mutating in Linq
.ForEach(a => a.IsSelected = !_searches.Contains(a.ColumnName));
编辑
正如其他人所提到的,创建一个新列表只是为了获取.ForEach
来更改(原始)集合中的对象是浪费的,并且在一组值类型中会丢失更改。 相反,使用foreach
(甚至for
)迭代原始集合。
首先,您只需要在从IEnumerable创建集合时调用ToList()一次。 在每个操作员昂贵且多余之后执行此操作。
其次只是改变你的状况。 一切都是真的,除了拖曳。
DisplayColumns.Where(a => a.ColumnName != "Bug" && a.ColumnName != "Feature").ForEach(a => a.IsSelected = true).ToList();
编辑:
对不起,我喜欢约翰的回答,因为这可能是一个重复发生的事情,或者IsSelected可能是Nullable,任何方式都可以让它保持尽可能通用。
我也喜欢斯图尔特的方法,收藏(我也想到了它,但不想混淆。所以让我们给出最好的世界。
当使用linq时,我们实际上正在构建一个表达式树,在结束时我们可以选择实现一个集合。
因为_searchs可以改变,每次我们实现该表达式时,我们都会使用该集合中当前的值来实现它,这使得我们的代码更加通用。
private static readonly string[] _searches = new [] {"Bug", "Feature"}
DisplayColumns.ForEach(a => a.IsSelected = !_searchs.Contains(a.ColumnName)).ToList();
我假设ForEach是类型IEnumrable的扩展方法
也许这个:
tmp = DisplayColumns.ToList();
var res = tmp.Except(tmp.Where(a => a.ColumnName == "Bug" || a.ColumnName == "Feature"));
foreach(var x in res) x.IsSeleceted = true;
不使用foreach
DisplayColumns
.Select(s=> {
s.IsSelected = (s.ColumnName == "Bug" && s.ColumnName == "Feature");
return s;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.