繁体   English   中英

在C#中优化Linq

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM