【问题标题】:Linq query that automatically excludes duplicates (one-liner)自动排除重复项的 Linq 查询(单行)
【发布时间】:2011-12-12 06:55:34
【问题描述】:

我有一个针对项目欧拉问题 243 的 linq 查询:

var y = from n in factors
        from m in factors where m != n
        select n * m;

问题在于,对于素因数 2 和 3,它会产生 y = {6, 6},而它只需为 {6}。

有没有办法在不多次调用 y.Distinct() 或 y.Contains() 的情况下做到这一点?

我也考虑过使用两个 foreach 循环,但问题是 - 我不能使用索引,所以它会很麻烦和尴尬。

【问题讨论】:

  • 不同的会起作用。为什么你不想使用 Distinct?
  • 1) 这意味着我必须再次浏览集合,如果您已经嵌套在多个循环中,这可能意味着很多。 2)一般美学:)
  • 所以你想要 1 班轮?像 var y= ( from .... m).Distinct();也将是 1 班轮。
  • 使用where m < n
  • @Rick facepalm - 太棒了

标签: c# linq optimization query-optimization


【解决方案1】:

您可以对结果值进行不同的调用。这样您就不必在内部循环中执行此操作。

var y = factors.SelectMany(n => factors.Where(m => n < m).Select(m => n * m)).Distinct();

如果factors = new[] { 2,3 } 你得到{ 6 } 作为结果。此外,如果factors = new[] { 2,3,4,6 } 你得到{ 6,8,12,18,24 } 而不是{ 6,8,12,12,18,24 }。注意结果中没有额外的12

【讨论】:

    【解决方案2】:

    正如Rick Sladkey所说,正在改变

        from m in factors where m != n
    

        from m in factors where m < n
    

    无需使用.Distinct()即可产生正确的结果。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2016-03-23
      • 1970-01-01
      • 2011-04-03
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多