【问题标题】:Unique Permutations of a list(why won't this work)? [closed]列表的唯一排列(为什么这不起作用)? [关闭]
【发布时间】:2013-09-25 12:22:09
【问题描述】:

我一直在寻找一种方法来按 3 组获取 List 的所有唯一排列。我发现了很多要下载的源代码和复杂的算法。

我终于想出了我自己的似乎可以工作的代码。有人可以告诉我为什么以下不是一个好主意。我假设由于我找到的所有复杂解决方案而我的解决方案似乎太简单了,所以我必须忽略某些东西。

var combinations = from a in Samples
                   from b in Samples
                   from c in Samples
                   where (string)a.sample != (string)b.sample 
                   && (string)a.sample != (string)c.sample 
                   && (string)b.sample != (string)c.sample 
                   select new Rank
                   {
                       sample = a.sample,
                       sampleb = b.sample,
                       samplec = c.sample 
                   };

foreach (var combo in combinations)
{
    string[] aut = { combo.sample, combo.sampleb, combo.samplec };
    Array.Sort(aut);
    combo.sample = aut[0];
    combo.sampleb = aut[1];
    combo.samplec = aut[2];
    l.Add(combo);
}

noDupes = from n in l
          group n by new { n.sample, n.sampleb, n.samplec } into g
          select new Rank
          {
              sample = g.Key.sample,
              sampleb = g.Key.sampleb,
              samplec = g.Key.samplec
          };

【问题讨论】:

  • 我见过的第一个问题是“我的代码也是 1337 吗?”。在我看来很好。继续前进。
  • 其实我想确定我没有遗漏什么。我对此很陌生。
  • 现在,现在,@user2525463... Linq 允许您非常简洁地编写笛卡尔连接。您的解决方案看起来不错。显然它也有效。我只是在这里没有看到一个合适的问题。
  • 这个问题似乎是题外话,因为它是关于代码审查的。在codereview.stackexchange.com 提出此类问题
  • 取决于样本的大小和性能的重要性。

标签: c# linq permutation


【解决方案1】:

您要添加所有内容,然后删除重复项。你不需要,看看这个(我的)关于排列的答案:https://stackoverflow.com/a/9315076/360211

应用到您的场景中,您有一个 3 位数字 (maxDigits = 3),其中 base = Samples.Count()

如果您的代码已经可以运行,那么这种方法的优势仅与性能有关。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2017-08-25
  • 2014-09-12
  • 2022-12-01
  • 2019-11-04
相关资源
最近更新 更多