C# 创建一个可能的两位数数字和四位数数字,而不是合并
如何生成由2位数字和4位数字组成的数字?假设这个数字是1214 它需要创建12,11,14,21,24,41,42 它跳过合并2位数字。数字位置3加1表示合并 原因,它已存在于位置1和位置3之间 到目前为止,我只能生成12,21,14。它还有其他的可能性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<
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()在LINQPad中使用code>来获取要执行的结果,但我在回答中没有提到这一点。我已经将答案更新为使用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();