【问题标题】:Array of array combinations数组组合数组
【发布时间】:2011-08-12 05:49:29
【问题描述】:

如何使用 LinQ/C# 生成相反值的各种组合 我有一个数组中的运算符列表,如"> < = + =" 我还有一个函数可以返回数组中每个项目的相反值。">" 的相反值是"<" 等等。所以考虑相反每个值的运算符如何生成各种可能的组合

示例: 问题陈述:

`string[] arrSample = new string[]{"!=","="};` //arrSample can be any object array with property values.The property can accept operator values like 
!=,=,>,< etc..

预期输出: 考虑反向运算符的各种组合将是

Output Sequence1: =,!=
Output Sequence2: !=,=
Output Sequence3: = , =
Output Sequence4: !=,!=

【问题讨论】:

  • 请您提供反向功能的代码 - taa
  • @Jon Egerton:它没有太多代码。只是返回任何给定运算符的相反值。假设我通过“=”它返回我“!=”:-)
  • 那么您是否只想获取传递的运算符及其反向运算符的列表,然后置换批次? string[] arrSample = new string[]{"!=","&lt;","+"}; 的输出是什么
  • 我看不懂sequence3和sequence4。这两个运营商有何不同?
  • 这是如何逆转运营商的,或者我错过了什么?您只是输出运算符的每个组合

标签: c# linq


【解决方案1】:

事实证明,这比看起来要难,但以下内容应该可以证明这个想法。

有两个步骤 - 为每个运算符及其反向创建一个数组列表对,然后递归地将它们排列在一起。

void DoProblem()
{
    //string[] arrSample = new string[] { "!=", "=" };
    string[] arrSample = new string[] { "!=", "<","+" };

    string[][] arrPairs = (from op in arrSample select new string[]{op, GetReverse(op)}).ToArray();

    List<Array> myList = new List<Array>();
    myList.AddRange(arrPairs);

    foreach (string x in Permute(0, myList))
    {
        Console.WriteLine(x);
    }

}

List<string> Permute(int a, List<Array> x)
{
    List<string> retval = new List<string>();
    if (a == x.Count)
    {
        retval.Add("");
        return retval;
    }
    foreach (Object y in x[a])
    {
        foreach (string x2 in Permute(a + 1, x))
        {
            retval.Add(y.ToString() + "," + x2.ToString());
        }

    }
    return retval;
}


string GetReverse(string op)
{
    switch (op) {
        case "=":
            return "!=";
        case "!=":
            return "=";
        case "<":
            return ">";
        case "+":
            return "-";    
        default:
            return "";
    }
}

注意:permute 函数基于 permute an Array of Arrays 答案:C# Permutation of an array of arraylists?

【讨论】:

  • 感谢某人的最佳方式是什么?非常感谢。这拯救了我的一天(我应该说一生)。再次感谢。
  • @SharpC - 没问题 - 乐于提供帮助。有一点脑筋急转弯总是很好。
【解决方案2】:
from operator in arrSample select operator + "," + ReverseOperator(operator)

还是我错过了什么?

【讨论】:

  • arrSample 包含两个运算符。暗示可能的组合为 2*2 = 4。再举一个例子。如果有 5 个运算符,则可能的组合总数为 2*2*2*2*2 = 32。这不仅仅是相反的值,而是各种可能的组合。
【解决方案3】:

你想要工会吗?

    string[] arrSample = new string[]{"!=","="};

    var list = (
            from item in arrSample
            select item + "," + item
        ).Union(
            from revItem in arrSample
            select revItem + "," + ReverseOperator(revItem)
        );

    List<string> final = new List<string>(list);

【讨论】:

    【解决方案4】:

    请找到以下最简单的方法来处理两个不同组合的字符串数组

    字符串[] 角色 = { "abc", "e", "f", "h" };

    string[] allRoles = { "a", "b", "c", "abc", "e", "f", "g", "h", "i" };

        foreach (string nextRole in allRoles)
        {
            if (Array.IndexOf(roles, nextRole) != -1)
            {
                Response.Write(nextRole + "<br/>");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2017-11-14
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多