开发者

How can I get just the first ten characters of a string in C# [duplicate]

This question already has answers here: What method in the String class returns only the first N charac开发者_StackOverflow中文版ters? (14 answers) Closed 5 years ago.

I have a string and I need to get just the first ten characters. Is there a way that I can do this easily.

I hope someone can show me.


You can use the String.Substring method; e.g.:

string s = "Lots and lots of characters";
string firstTen = s.Substring(0, 10);


You could create an extension method, like this:

public static class Extension
{
    public static string Left(this String input, int length)
    {
        return (input.Length < length) ? input : input.Substring(0, length);
    }
}

and then call it like this:

string something = "I am a string... truncate me!";
something.Left(10);


Depends :-)

Normally you are probably looking for SubString... but if you're doing fancy stuff with unicode, this demonstrates where that will go wrong (e.g. unicode ranges > 0xFFFF):

static void Main(string[] arg)
{
    string ch = "(\xd808\xdd00汉语 or 漢語, Hànyǔ)";

    Console.WriteLine(ch.Substring(0, Math.Min(ch.Length, 10)));

    var enc = Encoding.UTF32.GetBytes(ch);
    string first10chars = Encoding.UTF32.GetString(enc, 0, Math.Min(enc.Length, 4 * 10));
    Console.WriteLine(first10chars);

    Console.ReadLine();
}

The reason that goes wrong is because chars are 16-bit and Length checks UTF-16 chars and not unicode characters. That said, that's probably not your scenario.


A quick, one-liner where the variable s is your string:

public string GetFirstTenCharacters(string s)
{
    // This says "If string s is less than 10 characters, return s.
    // Otherwise, return the first 10 characters of s."
    return (s.Length < 10) ? s : s.Substring(0, 10);
}

And just call this method like this:

string result = this.GetFirstTenCharacters("Hello, this is a string!");


there will be no exception even if string lengeth is <10

String s = "characters";
String firstTen = s.Substring(0, (s.Length < 10) ? s.Length : 10);


string longStr = "A lot of characters";
string shortStr = new string(longStr.Take(10).ToArray());


Lots of options like:

string original = "A string that will only contain 10 characters";
//first option
string test = original.Substring(0, 10);
//second option
string AnotherTest = original.Remove(10);
//third option
string SomeOtherTest = string.Concat(original.Take(10));

Hope it helps out.


Getting the substring of specific length is very simple and easy in C#, however it's important to get it done in the most efficient way.

Points to be considered:

  1. Error Handling
  2. Performance

Below is an example of performing it in the simplest and most efficient way possible:

ASPX:

<body>
<form id="form1" runat="server">
<div>
    <asp:TextBox runat="server" ID="txtInput"></asp:TextBox>
    <asp:Button runat="server" ID="btn10Chars" onclick="btn10Chars_Click" text="show 10 Chars of string"/><br />
    <asp:Label runat ="server" ID="lblOutput"></asp:Label>
</div>
</form>

C#:

 public partial class Home : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btn10Chars_Click(object sender, EventArgs e)
    {
        lblOutput.Text = txtInput.Text.Length > 10 ? txtInput.Text.Substring(0, 10) : txtInput.Text + "  : length is less than 10 chars...";
    }
}

Take-aways from the example:

  1. Error Handling without using try catch.
  2. Ternary operator is used which is best in terms of performance while compared to if condition.
  3. All together, it's just one line of code to achieve the required functionality.


It depends on what you mean by character. The C# char type is a WORD (or a ushort - min value: 0 and max value: 65535 (2^16)). Different text normalization might yield different results, example: NFC might represent a character as 1 char while NFD would represent that same character as 2.

Using String.Substring should work if you're only using 7-bit ASCII. Text normalization will play a role in 8-bit/extended ASCII, UTF-8 ~ 32 due to surrogate pairs and combining characters.

If you want to grab the first 10 characters (not char's), you should use:

public static string TakeCharacters(string input, int index, int count)
{
    if (input == null) return null;
    if (index >= input.Length)
        throw new ArgumentOutOfRangeException(
            "index",
            string.Format("index {0} is out of range (max {1})", index, input.Length - 1));
    if (count <= 0)
        throw new ArgumentException("length should be greater than zero", "count");

    var builder = new StringBuilder();
    while (index < input.Length && count > 0)
    {
        var c = StringInfo.GetNextTextElement(input, index);
        builder.Append(c);
        index += c.Length;
        count--;
    }
    return builder.ToString();
}

Note that StringInfo combines characters/pairs and GetNextTextElement returns a string. The index and count parameters are passed by value and thus can be used inside the method without aliasing.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜