C# 从两个字符串c中获取所有唯一的组合

C# 从两个字符串c中获取所有唯一的组合,c#,string,C#,String,我希望从两个字符串中获得所有唯一的组合,例如: STRING 1: "OK" STRING 2: "OK" 期望输出 OKOK KOOK OKKO KOKO 我找不到任何有用的信息来帮助我从两个字符串中获得所有唯一的组合,只有一个字符串 提到两点:我想获得一些关于循环和长度超过5个字符的字符串的使用指南,输出应该是4个字符的组,每个字符串两个字符 STRING 1: "FOUR" STRING 2: "FIVE" 输出 FOFI OUIV URVE FOIV OUVE 依此类推,直到达到

我希望从两个字符串中获得所有唯一的组合,例如:

STRING 1: "OK"
STRING 2: "OK"
期望输出

OKOK
KOOK
OKKO
KOKO
我找不到任何有用的信息来帮助我从两个字符串中获得所有唯一的组合,只有一个字符串


提到两点:我想获得一些关于循环和长度超过5个字符的字符串的使用指南,输出应该是4个字符的组,每个字符串两个字符

STRING 1: "FOUR"
STRING 2: "FIVE"
输出

FOFI
OUIV
URVE
FOIV
OUVE
依此类推,直到达到其最大独特组合。 请考虑我为此做了大量的研究,没有任何结果。 谢谢

到目前为止我的代码

class MainClass {
    public static void Main(string[] args)
    {
        Console.WriteLine("Name");
        string name = "OK";
        Console.WriteLine("Lastname");
        string lastname = "OK";
        var nchars = name.ToCharArray();
        var pchars = lastname.ToCharArray();
        var ncharsCount = nchars.Length;
        var pcharsCount = pchars.Length;
            int ctr0;
            int ctr;
            int ctr2;
            for (ctr0 = 0; ctr0 < 1 ;ctr0++){
              for(ctr = 0; ctr<name.Length;ctr++){
                for(ctr2=1;ctr2<lastname.Length;ctr2++){
                Console.WriteLine("{0}{1}{2}{3}{4}", ctr0,nchars[ctr%ncharsCount],nchars[ctr2%ncharsCount],pchars[ctr%pcharsCount],pchars[ctr2%pcharsCount]);
            }
          }
        }
    }
}

这是不完整的,也是无效的,考虑到如果我们有一个字符串OK,那么KKK是不可能实现的。

所以您需要一个字符串中两个字符和另一个字符串中两个字符的所有可能组合

当遇到这样的问题时,您可以从将项目划分为子步骤开始:

您可能需要一个从单个字符串中提供所有两个字符组合的方法 另一种方法是采用两个字符组合的两个集合,并将它们组合成所有可能的四个字符组合 一种以各种可能的方式排列四个字符组合的方法 您可能希望从结果中删除所有重复的四个字符组合
你不必遵循我对子步骤的划分,你可以创建自己的子步骤——但这是当我被问题压倒时我通常采用的方法。当你再次陷入困境时,你会在这个网站上提出一个更具体的问题,你会得到更好的答案。

让我们把最初的任务分成几个小任务:

给定字符串中的所有2个字符片段:

private static IEnumerable<string> SubStrings(string value, int length = 2) {
  if (string.IsNullOrEmpty(value))
    yield break;
  else if (length <= 0)
    yield break;

  for (int i = 0; i < value.Length; ++i) {
    StringBuilder sb = new StringBuilder(length);

    for (int j = 0; j < length; ++j)
      // modulo arithmetics to restart from the beginning e.g. "FOUR" -> "RF" 
      sb.Append(value[(i + j) % value.Length]); 

    yield return sb.ToString();
  }
}
最后,让我们添加不同的:

结果

好的,好的,我们有

编辑:Linq SelectMany,Distinct在查询数据时非常方便。然而,如果你想摆脱它,你必须这样做:

// For Distinct, since HashSet contains unique values only
HashSet<string> result = new HashSet<string>();

foreach (string left in SubStrings(string1))
  foreach (string right in SubStrings(string2)) 
    result.Add(left + right);

Console.Write(string.Join(Environment.NewLine, result));

你尝试了什么?我想得到一些指导或现成的代码?到目前为止你尝试了什么?OOKK和KKOO呢?@HimBromBeere它不可能是OOKK,因为两个字符来自一个字符串,例如第一个字符串没有两个O,它有O和K。@LudovicFeltz,发布了我代码的当前状态非常感谢你的建议,这就是我来这里的原因,因为我找不到任何有用的东西,所以我的脑子里确实有这种类型的子步。这正是我想要的。还有一个快速的问题,考虑到我还在学习,这对我来说有点难读,有没有可能去掉IEnumerable和。选择它们并用for循环替换它们?也许这是一个愚蠢的问题,但我正在试图理解它是如何工作的。Bogdan Darius好吧,我们可以将笛卡尔连接转化为嵌套循环,但我们必须解决如何窥视不同的值,只有你可以利用HashSet来实现这一点。请看我的编辑谢谢你百万次德米特里,很好的解释,现在一切都很清楚了。干得好
 SubStrings(string1)
   .SelectMany(left => SubStrings(string2).Select(right => left + rigth));
 using System.Linq;

 ...

 string string1 = "FOUR";
 string string2 = "FIVE";

 var result = SubStrings(string1)
   .SelectMany(left => SubStrings(string2).Select(right => left + right))
   .Distinct();

 Console.Write(string.Join(Environment.NewLine, result));
FOFI
FOIV
FOVE
FOEF
OUFI
OUIV
OUVE
OUEF
URFI
URIV
URVE
UREF
RFFI
RFIV
RFVE
RFEF
OKOK
OKKO
KOOK
KOKO
// For Distinct, since HashSet contains unique values only
HashSet<string> result = new HashSet<string>();

foreach (string left in SubStrings(string1))
  foreach (string right in SubStrings(string2)) 
    result.Add(left + right);

Console.Write(string.Join(Environment.NewLine, result));