Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7488811
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 29, 20262026-05-29T15:02:39+00:00 2026-05-29T15:02:39+00:00

I am trying to find an efficient way to sort an array of strings

  • 0

I am trying to find an efficient way to sort an array of strings based on a numeric value within each string element of the array. I am currently using the Array.Sort(array, customComparer) static method (quick sort), with my custom comparer class (sorting in descending order) being:

class StringComparer : IComparer<string>
{
    public int Compare(string a, string b)
    {
        string s1 = a;
        string s2 = b;

        Match matchA = Regex.Match(s1, @"\d+$");
        Match matchB = Regex.Match(s2, @"\d+$");

        long numberA = long.Parse(matchA.Value);
        long numberB = long.Parse(matchB.Value);

        if (numberB - numberA < 0)
        {
            return -1;
        }
        else 
        {
            return 1;
        }
    }
}

This works very well, but sometimes it takes too much time to sort, with an array of 100 000 strings taking more than a minute on a 2.4Ghz processor. I wonder if there is a more efficient way to accomplish the same. For example, implementing a different sorting algorithm or taking another approach like using a dictionary and sorting on the value (the value being the numeric part of the string). Any suggestions? Thanks in advance!

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-29T15:02:41+00:00Added an answer on May 29, 2026 at 3:02 pm

    First, you’re needlessly parsing the same string over and over (both matching with the regular expression and then parsing the matches). Instead, encapsulate what you have into a custom type so that you only have to parse once.

    public class FooString {
        private readonly string foo;
        private readonly long bar;
    
        public FooString(string foo) {
            this.foo = foo;
            Match match = Regex.Match(foo, @"\d+$");
            this.bar = Int64.Parse(match.Value);
        }
    
        public string Foo { get { return this.foo; } }
        public long Bar { get { return this.bar; } }
    }
    

    I’d even add a Contract.Requires to this class that says that foo must satisfy the regular expression.

    Second, you have an IComparer<T> that dies on certain values of T (in your case, strings that don’t match the regular expression and can’t be parsed to a long). This is generally a bad idea.

    So, make the comparer for FooString:

    public FooStringComparer : IComparer<FooString> {
        public int Compare(FooString a, FooString b) {
            Contract.Requires(a != null);
            Contract.Requires(b != null);
            return a.Bar.CompareTo(b.Bar);
        }
    }
    

    Now, your sorting will be blazingly fast because you’ve stopped parsing the same string over and over.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am trying to find an efficient way of ordering a array by a
I'm trying to find out the most efficient (best performance) way to check date
Trying to find an efficient way to extract all instances of items in an
I'm trying to find an efficient way to find the rank of an object
I'm trying to find the most efficient way to determine if a table row
I'm trying to find a fairly efficient way of printing specific lines of a
I'm trying to find an efficient deterministic way of allocating a 32-bit handle in
I'm trying to find a efficient way to watch the server log on a
I'm trying to find the most efficient way to alpha blend in SDL. I
I'm trying to find the most efficient way to get all objects from the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.