如何使用C#过滤字符串的前10个字符

4

我想创建一个信用卡编码器(如果这个词确实存在),它可以将字符串的前10位变成'*'。这是我想到的代码:

public static string[] ToCencoredString(this string str)   
{
    char[] array = Enumerable.Repeat('*', str.Length-1).ToArray();
    array = array.Select((cha, index) =>
    {
        if (index < 10)
           array[index] = str[index];
    });
}

忽略函数返回值为string[]的事实,代码中还有另一个与此无关的部分。

我不知道为什么,但我一直收到ArgumentNullException,这很奇怪,因为在array中没有一个值是null

我做错了什么?


可能更容易的方法是使用 String.Substring 然后将剩下的部分添加到 new string('*'); 中。 - TheGeneral
为什么不用简单的字符串连接和子字符串呢?return "******" + str.Substring(10); - Aleks Andreev
@AleksAndreev 我需要以这种格式的代码,因为有更多的重载函数缺少参数,你需要从函数调用者中获取审查字符串长度。 - user11814338
1
为什么你返回 string[] - Tim Schmelter
我认为你应该将 str.Length-1 改为 str.Length - jetstream96
5个回答

7

可以考虑将它改为更简单的内容:

var result = string.Concat(Enumerable.Repeat("*", 10)) + str.Substring(10);

1
什么是 string.Concat? - user11814338
请看这里:https://learn.microsoft.com/zh-cn/dotnet/api/system.string.concat?view=netframework-4.8#System_String_Concat_System_String___ - andyb952

5

我会使用更高效的版本,使用String.Substring字符串构造函数

public static string ToCencoredString(this string str, int length = 10)
{
    if (String.IsNullOrEmpty(str)) return str;
    string censored = new string('*', length);
    if (str.Length <= length) return censored;
    return censored + str.Substring(length);
}

4
我建议您使用原始数组进行迭代,以便可以利用其索引创建掩码。 String.Join() 可能会帮助您生成掩码输出。 代码应该是这样的:
string maskedInput = String.Join("", str.Select((c, index) => index < 10? '*' : c));

这是一个供您参考的可运行的示例

0

$"{string.Concat(Enumerable.Repeat("*", 10))}{FIELD.Substring(10)}";

的意思是将 FIELD 变量的第十个字符及其后面的字符替换为十个星号,然后将结果作为字符串输出。


0

你的代码无法编译。所以我不知道你是如何到达ArgumentNullException的。

而且这也不是使用LINQ的正确方式。虽然上面的答案显然更好,但实现你想要的功能的正确方式是:

array = array.Select((cha, index) =>
{
    if (index < 10)
        return array[index];
    else
        return str[index];
}).ToArray(); 

我在编译时达到了它。 - user11814338
是的,我对 LINQ 还很陌生。 - user11814338

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接