2011-04-25 185 views
1

如何使用LinQ/C生成相反值的各种组合 我有一个像"> < = + ="这样的数组中的运算符列表我还有一个函数,它可以返回数组中每个项目的相反值。的">"相反值是"<"等on.So考虑对于每个反向运营商和每一个值如何生成各种可能的组合阵列组合的阵列

样品: 问题陈述:

`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: !=,!= 
+0

请你能提供的反函数的代码 - TAA – 2011-04-25 10:03:29

+0

@乔恩·埃杰顿:它没有太大的code.Just的返回任何给定的operator.Say我通过相反值“=”返回我“!=”:-) – SharpC 2011-04-25 10:06:27

+0

那么你只是想得到一个传递的运算符和它们的逆运算符的列表,并排列整个区域? 'string [] arrSample = new string [] {“!=”,“<”,“+”};输出结果是什么?' – 2011-04-25 10:10:34

回答

2

这看起来比看起来更难,但下面应该证明这个想法。

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

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 ""; 
    } 
} 

注:置换功能是基于该置换数组的数组回答这里:C# Permutation of an array of arraylists?

+0

什么是感谢某人的最佳方式?谢谢你。这节省了我的一天(我应该说终身)。再次感谢。 – SharpC 2011-04-25 13:27:38

+0

@SharpC - 没有问题 - 很乐意帮忙。当一个脑筋急转弯出现时,它总是很好。 – 2011-04-25 13:57:35

0
from operator in arrSample select operator + "," + ReverseOperator(operator) 

还是我错过了什么?

+0

arrSample包含两个运算符.Implies可能的组合是2 * 2 = 4。举另一个例子。如果有5个操作员,那么总的可能组合将是2 * 2 * 2 * 2 * 2 = 32.它不只是相反的值,而是各种可能的组合。 – SharpC 2011-04-25 10:13:34

0

你想一个工会?

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); 
0

发现以下最简单的方法用不同的组合的两个字符串数组

串[]角色= { “ABC”, “E”, “F”, “H”};字符串[] 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/>"); 
     } 
    }