C# 创建一个可能的两位数数字和四位数数字,而不是合并

C# 创建一个可能的两位数数字和四位数数字,而不是合并,c#,C#,如何生成由2位数字和4位数字组成的数字?假设这个数字是1214 它需要创建12,11,14,21,24,41,42 它跳过合并2位数字。数字位置3加1表示合并 原因,它已存在于位置1和位置3之间 到目前为止,我只能生成12,21,14。它还有其他的可能性 class Program { static void Main(string[] args) { char[] digits = { '1', '2', '1', '4' }; List<

如何生成由2位数字和4位数字组成的数字?假设这个数字是1214

它需要创建12111421244142

它跳过合并2位数字。数字位置3加1表示合并

原因,它已存在于位置1和位置3之间

到目前为止,我只能生成122114。它还有其他的可能性

class Program
{
    static void Main(string[] args)
    {
        char[] digits = { '1', '2', '1', '4' };

        List<string> numbers = new List<string>();

        for ( int i = 0; i < digits.Length; i++ )
        {
            ushort increment = 1;
            string number = String.Empty;

            if ( i != 3 )
            {
                number = digits[i].ToString() + digits[i + increment].ToString();
            }

            if ( i == 0)
            {
                numbers.Add(number);
            }
            else
            {
                // Compare to check element inside numbers already exists or not
                if ( numbers.Contains("number") == false)
                {
                    numbers.Add(number);
                }
            }
        }

        foreach ( string number in numbers)
        {
            Console.WriteLine(number);
        }        
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符[]位={1',2',1',4'};
列表编号=新列表();
对于(int i=0;i
您可以这样做:

    string str = "1214";
    string x;
    string y;
    int digitsCount = str.Count(c => char.IsDigit(c));
    if (digitsCount > 2) {    
        for (int i = 0; i < digitsCount; i++)
        {
            x = str.Substring(i, 1);
            for (int ii = i+ 1; ii < digitsCount ; ii++)
            {
               y = str.Substring(ii, 1);                      
               Console.WriteLine(x + " " + y);
            }
        }
    }

…我不确定我是否理解41和42,但是…

这是我能想到的最简单的方法

var number = 1214;
var text = number.ToString();

var query =
    from i in Enumerable.Range(0, text.Length)
    from j in Enumerable.Range(0, text.Length)
    where i != j
    select $"{text[i]}{text[j]}";

var results = query.Distinct().ToArray();

这给了我
12,11,14,21,24,41,42

这回答了你的问题吗?我对
if(numbers.Contains(“number”))
感到非常困惑。你的意思是
if(number.Contains(number))
?您了解这两个代码片段之间的巨大差异吗?代码中需要改进的地方有:(1)字符串是不灵活的;你可以说
digits=“1214”
和其余代码的工作原理相同。字符串被视为只读字符数组。(2) 如果(x==false)
,不要说
。如果(!x)
。这是更好的款式。(3) 使用
HashSet
而不是
List
可以完全避免包含检查。散列集会自动为您丢弃重复项。(4)不要以这种方式使用
ushort
<代码>ushort
的存在是为了与旧式C/C++代码进行互操作。使用
int
表示少量。您可能需要在
Distinct()
之后使用
ToList()
来执行查询。@EricLippert-是,同意。我刚刚做了一个
String.Join(“,”,results.Dump()来获取要执行的结果,但我在回答中没有提到这一点。我已经将答案更新为使用
ToArray()
-我喜欢这样的想法,即我得到了一个我无法更改的列表-
列表
太过宽容了,我认为。你可以更改数组;数组元素是变量@哦,是的,但是如果不创建一个新的数组,我就不能删除或添加元素到数组中。这就是我认为对
列表
过于宽容的地方。理想情况下,我希望返回一个只读数组。@Enigmativity:如果这是您关心的问题,为什么不返回一个
IENumerable
ReadOnlyCollection
?请注意,我的倾向是避免
ReadOnlyCollection
,除非我的目标是能够包装现有集合以避免分配。OP正在进行两个字符的无序选择。
41
42
来自
4
的反向操作。好的,然后他转储重复的41。谢谢分享,我错过了。
var number = 1214;
var text = number.ToString();

var query =
    from i in Enumerable.Range(0, text.Length)
    from j in Enumerable.Range(0, text.Length)
    where i != j
    select $"{text[i]}{text[j]}";

var results = query.Distinct().ToArray();