【问题标题】:Permutations of arrays within an array数组中数组的排列
【发布时间】:2012-04-17 11:44:25
【问题描述】:

我正在做一个项目,我需要找到一个数组的所有可能排列。

在一定程度上我有这个工作

var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" }};
var perms = from a in geneticsArray[0]
            from b in geneticsArray[1]

            select new { a, b };

这为我提供了所有选项:

  • MM
  • 虚拟机
  • MV
  • VV

这是正确的,但这不是我想要实现的,因为我的意图和目的 VM 和 MV 是一回事。

如何获得转换 MV 到 VM?

这个例子很简单,只包含2个分组,可以有无限个分组,这点我稍后会处理,但只是想让你知道,所以回复不是简单地反转结果。

对此的任何帮助都会很棒。

进一步编辑

通过以下代码,我可以看到每个排列的计数:

var permCounts = from perm in perms group perm by perm into b select new { b.Key, Count = b.Count() };

这将告诉我上述每个选项都出现一次,这不太正确,因为在这种情况下,上面的 MV 和 MV 的大纲是相同的。我需要代码来理解这一点。

这就是我要找的,而不是如何让它能够处理未知数量的组合。

谢谢

【问题讨论】:

  • 看看这个涵盖许多排列和组合要求的项目:codeproject.com/Articles/26050/…
  • 您的代码没有任何意义。因为e,f,g,h,我不会编译,即使它编译了,它也不会工作,因为你超出了数组的范围。
  • @svick 感谢您指出这一点,我从一个更大的工作示例中复制并粘贴了它,现在代码是正确的

标签: c# arrays linq multidimensional-array


【解决方案1】:

这个怎么样?

        var perms = from a in geneticsArray[0]
                    from b in geneticsArray[1]

                    select new string[] { a, b };

        var dict = new Dictionary<string, int>();
        foreach (var ent in perms)
        {
            Array.Sort(ent);
            var _ent = string.Join(",", ent);
            if (dict.ContainsKey(_ent))
            {
                dict[_ent]++;
            }
            else
            {
                dict.Add(_ent, 1);
            }
        }

        return dict;

【讨论】:

    【解决方案2】:

    我们会这样做的:

    var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" } };
    var perms = from a in geneticsArray[0]
                from b in geneticsArray[1]
                where a.CompareTo(b) >= 0
                select new { a, b };
    

    通过递归处理不同大小的列表也更容易(看看 Eric Lippert 的这篇文章 - http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

    【讨论】:

    • 示例代码已经更新,现在可以编译...复制和粘贴错误:(
    • 我认为指向 Eric 帖子的链接会对您有用,但当然这篇帖子没有回答您的问题
    • 是的,现在我可以看到了。 OP 想要独特的排列; Eric 的代码给出了非唯一的组合。
    • @Nikolay 您的代码将不起作用,因为您无法以这种方式比较字符串。但是where a.CompareTo(b) &gt;= 0 应该可以工作
    • @SteveMallory 你是对的,我只是很明显如何使用字符串来做到这一点。修正了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 2010-10-17
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多