【问题标题】:How to permute C# Tuple Items? [closed]如何排列 C# 元组项? [关闭]
【发布时间】:2015-07-04 13:57:01
【问题描述】:

如何置换包含多个字符串项的元组?

【问题讨论】:

  • 问题是关于它是否可能(有 n 项元组)

标签: c# tuples permutation combinatorics


【解决方案1】:

因为"6"是一个很小的数字,直接写下来效率最高:

tupple1 = a,b,c
tupple2 = a,c,b
...

您无法在更短的时间内创建程序。

如果您对更通用的解决方案感兴趣,请查看 SO 上的大量链接之一,例如:Permutation algorithms in C#

【讨论】:

  • 好吧,如果我还有一个string d,那么这个数字就是24。
  • 好吧,那么这是一个不同的问题
  • 那我应该使用 LINQ 吗?
  • @AndrejsIgumenovs,如果您需要帮助为 n 元素元组创建 n! 排列,那么请发布一个问题,询问您到目前为止所取得的成就。就目前而言,这是对您当前糟糕问题的一个很好的回答。
  • 请检查右列“相关”中的链接。你会找到很多答案
【解决方案2】:

恐怕手动使用Tuple。所以:

var tuple = new Tuple<string, string, string>("a", "b", "c");
var combination_1 = String.Concat(tuple.Item1, tuple.Item2, tuple.Item3);
var combination_2 = String.Concat(tuple.Item1, tuple.Item3, tuple.Item2);
var combination_3 = String.Concat(tuple.Item2, tuple.Item1, tuple.Item3);
var combination_4 = String.Concat(tuple.Item2, tuple.Item3, tuple.Item1);
var combination_5 = String.Concat(tuple.Item3, tuple.Item1, tuple.Item2);
var combination_6 = String.Concat(tuple.Item3, tuple.Item2, tuple.Item1);

使用修改后的 Eric Liperts 扩展方法,您可以执行以下操作:

扩展方法:

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };

    return sequences.Aggregate
        ( emptyProduct, (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            where !accseq.Contains(item)
            select accseq.Concat(new[] { item })
        );
}

用例:

var array = new string[] { "a", "b", "c", "d", "e" };
var result = Enumerable.Range(0, array.Length).Select(_ => array).CartesianProduct();

// Print results
foreach (var item in result)
    Console.WriteLine(String.Join("", item));

如果您希望获得 所有 排列,包括 "aaa""aab" 等,只需删除

where !accseq.Contains(item) 来自扩展方法。

【讨论】:

  • 也这样:string[] stringArray = {tuple.Item1, tuple.Item2, ... tuple.ItemN};(先解包元组对象)
  • @AndrejsIgumenovs 是的,没错。您可以将元组中的项目放入数组并使用相同的扩展方法。
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多