C# 4.0 将字符串限制为八个字符,并返回带星号的字符串

C# 4.0 将字符串限制为八个字符,并返回带星号的字符串,c#-4.0,C# 4.0,我有一个学生要去。我想确定号码 LastName的字符数。如果字符数大于 如果大于8,则返回8个字符的姓氏,其中包含两个星号 剪掉其他角色 e、 阿布马德姆酒店** 这是我如何开始的。我无法让它工作。你能帮忙吗 public class StudentDto { public string Firstname { get; set; } public string EmailAddress { get; set; } public string LastName

我有一个学生要去。我想确定号码 LastName的字符数。如果字符数大于 如果大于8,则返回8个字符的姓氏,其中包含两个星号 剪掉其他角色

e、 阿布马德姆酒店**

这是我如何开始的。我无法让它工作。你能帮忙吗

public class StudentDto
{
    public string Firstname { get; set; }
    public string EmailAddress { get; set; }

    public string LastName
    {
        get
        {
            var checkLength = LastName.Length;
            string First8Chars = string.Empty;
            int count=0;
            List<char> storeStrings = new List<char>();

            if (checkLength > 8)
            {                        
                foreach (var c in LastName)
                {
                    storeStrings.Add(c);
                    if ()
                    {
                    }
                    count++;
                }
            }
        }
    }
}

如果由于某种原因无法使用库函数:

private string _lastName = "";

    public string LastName
    {
        get
            {
                var checkLength = _lastName.Length;
                string First8Chars = string.Empty;
                string storeStrings = "";

                if (checkLength > 8)
                {
                    foreach (var c in _lastName)
                    {
                        storeStrings += c;
                        if (storeStrings.Length == 8)
                        {
                            storeStrings += "**";
                            return storeStrings;
                        }
                    }

                }
                return storeStrings;
            }
        set { _lastName = value; }
    }
我注意到的一件事是,在LastName属性getter中使用LastName,这是一个很大的no-no,它会导致递归,并且可能会出现堆栈溢出异常

这可以写得更简洁,但我将把它作为一个练习留给你

就这样做吧:

string _backingFieldLastName;
public string LastName
{
    get
    {
        return _backingFieldLastName == null || backingFieldLastName.Length <=8 ? 
               _backingFieldLastName :
               _backingFieldLastName.Substring(0,8) +"**"; // second parameter of substring is count of chars from the start index (first parameter)
    }
    set
    {
       _backingFieldLastName = value;
    }
}
string\u backingFieldLastName;
公共字符串姓氏
{
得到
{
return _backingFieldLastName==null | | backingFieldLastName.LengthLinq方式:

var lastname = "Abumademal";
var formatted = (new string(lastname.Take(8).ToArray())).PadRight(lastname.Length, '*');
// will yield "Abumadem**"
获取8个字符并从此数组中创建一个新字符串,然后根据需要用*填充它

全面实施:

private string lastname;

public string LastName
{
    get
    {
        if (null == this.lastname)
        {
            return null;
        }

        char[] firsteight = this.lastname.Take(8).ToArray();
        string tmp = new string(firsteight);
        // padding this way wasn't the actual requirement ...
        string result = tmp.PadRight(this.lastname.Length, '*');
        return result;
    }

    set
    {
        this.lastname = value;
    }
}

您可能希望查看
String.Substring
让库为您做更多的工作。String类有很好的方法来查找索引或获取子字符串。类似于LastName.Length>8:LastName.Substring(0,7)+“**”:LastName调用“var checkLength=LastName.Length;”时,您似乎还有一个循环。它将执行与当前相同的LastName获取。一次又一次。这是一个不能使用字符串类方法的家庭作业吗?请给我看一些示例代码好吗?我对库函数没问题。那很好。我该怎么做?谢谢Steve。把它放在哪里而不是放在gette中r、 也许我可以在存储过程级别执行此操作,因为我正在使用一个。我的意思是,您正在从LastName属性中访问LastName属性,该属性是递归的,会导致堆栈溢出。这就是为什么我通过添加字符串_LastName并使用该字符串将其更改为backed属性。使用更短的下面的示例比我发布的示例要好,我发布的示例假设您不能使用库函数。
private string lastname;

public string LastName
{
    get
    {
        if (null == this.lastname)
        {
            return null;
        }

        char[] firsteight = this.lastname.Take(8).ToArray();
        string tmp = new string(firsteight);
        // padding this way wasn't the actual requirement ...
        string result = tmp.PadRight(this.lastname.Length, '*');
        return result;
    }

    set
    {
        this.lastname = value;
    }
}