【问题标题】:Refactor foreach and if's to Linq重构 foreach 和 if's 到 Linq
【发布时间】:2016-09-08 04:39:10
【问题描述】:

是否可以将所有给定的代码组合到 linq,然后返回 'true' 或 'false'?还是这样就可以了?

如果可能,会不会有显着的性能差异?(数组和列表不会包含超过 100 个元素)

foreach (var item in myArray)
{
    if (myList.Exists(x => x.Value == item))
    {
        amountTrue++;
    }
}

if (myArray.Count() == amountTrue)
{
    isValid = true;
}

【问题讨论】:

  • 不要为了性能而重构,而是为了可读性和可维护性。
  • 如果您只需要知道是否所有元素都在列表中。如果一个元素不在列表中,只需检查循环然后中断。

标签: c# linq


【解决方案1】:

据我所知,代码是用来检查的

如果myArray的所有项目都在myExists

实现:

  isValid = myArray
    .All(item => myList.Exists(x => x.Value == item));

如果您想针对 性能 以及 可读性 进行重构,请查看瓶颈。说,是myList.Exists 变慢了吗?在这种情况下,想想HashSet<T>,其中Tx.Value 等类型。

【讨论】:

  • 你必须小心 LINQ 的 All() 方法。这是一个空洞的真实陈述。因此,如果 myArray 为空,isValid 最终会为真。除了 All() 之外,最好检查一下 myArray 是否为空。 #BattleScars
  • @Rafael Dowling Goodman:从您当前的代码中可以看出,如果数组为空,则 amountTrue == 0 因而 (myArray.Count() == amountTrue)true;我建议的重构也是如此
【解决方案2】:

如果我理解了这个问题,你想知道数组中的所有项目是否都存在于列表中:

bool isValid = !myArray.Except(myList.Select (l => l.Value )).Any();

那么这将是一种有效的方法,因为Except 使用一个集合,而Any 在第一次丢失时停止。

【讨论】:

  • @Dmitry Bychenko 解决了它非常高效且易于阅读。使用您的代码,您会更难理解您在做什么。
  • 如果只需要bool 结果,这确实是最有效的方法。 +1(添加说明)
  • @OscarVicentePerez 对于未经训练的人来说可能更难,但效率更高。 +1
  • 搜索除了 impl 我发现了这个:stackoverflow.com/questions/10269610/…。所以我必须赞成效率部分(但不是为了可读性)
【解决方案3】:

不要为了性能而重构,而是为了可读性和可维护性。但是是的,有一个 LINQ 查询应该是高效的 可读的:

bool isValid = myArray.All(item => myList.Any(x => x.Value == item));

如果您还需要知道计数,您有多种选择:

例如Enumerable.Any:

int amountTrue = myArray.Count(item => myList.Any(x => x.Value == item));

使用HashSet<T> 更有效,假设string

var uniqueValues = new HashSet<string>(myList.Select(x => x.Value));
int amountTrue = myArray.Count(uniqueValues.Contains);

【讨论】:

  • 您做的工作太多,请参阅@Dmitry Bychenko 的回答
  • @OscarVicentePerez:后来注意到了,现在我提供了多种方法
  • 我知道,我只是告诉蒂姆。现在我发现它的答案更好。
【解决方案4】:

这是 LINQ 实现

var res = ((from z in myArray
            where myList.Exists(x=>x.Value=z)
            select z).Count())==myArray.Count()

【讨论】:

  • @OscarVicentePerez 存在(在您看来)稍微好一点的答案并不是拒绝其他好的和正确答案的好理由。
  • 否决票的原因不是现有答案。这是可读性和性能,因为他做得比需要的多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2015-09-19
  • 2023-04-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多