Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 400
  • Last Modified:

Ignoring first X characters from an array when sorting.

I have an array of roughly 5000 elements, each of which is in this format:

"\\\\192.168.5.6\\log\\freeswitch.log.2010-06-20-18-54-29.1"      string
AND
"\\\\192.168.5.8\\log\\freeswitch.log.2010-08-03-20-09-40.1"      string

I need to sort this array by the dates, not by the server address. How would I go about making it so that the Array.Sort() method ignores all characters prior to "log"? From what I can see, I need to implement an IComparer interface, I'm just not too sure how.

0
Kilsol
Asked:
Kilsol
  • 2
  • 2
1 Solution
 
Todd GerbertIT ConsultantCommented:
Here's a simple example, this skips the first 4 chars
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
			string[] strings = { "bbb.log.1", "aaa.log.2", "ddd.log.3", "ccc.log.4" };

			Console.WriteLine("Normal sort:");
			Array.Sort(strings);
			foreach (string s in strings)
				Console.WriteLine(s);

			// Reset array
			strings = new string[] { "bbb.log.1", "aaa.log.2", "ddd.log.3", "ccc.log.4" };
			Console.WriteLine("\r\nCustom sort:");
			Array.Sort(strings, new SkipFirstNCharComparer(3));
			foreach (string s in strings)
				Console.WriteLine(s);

			Console.ReadKey();
		}
	}

	public class SkipFirstNCharComparer : IComparer
	{
		private int _charsToSkip;
		public SkipFirstNCharComparer(int numCharsToSkip)
		{
			_charsToSkip = numCharsToSkip;
		}
		public int Compare(object x, object y)
		{
			int maxLen = ((string)x).Length > ((string)y).Length ? ((string)x).Length : ((string)y).Length;
			return String.CompareOrdinal((string)x, _charsToSkip, (string)y, _charsToSkip, maxLen);
		}
	}
}

Open in new window

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
If you want to compare based on the DATES then you need to extract those portions and convert them to Dates so you can do that comparison...

...something like:
private void button1_Click(object sender, EventArgs e)
        {
            string[] data = {"\\\\192.168.5.8\\log\\freeswitch.log.2010-08-03-20-09-40.1", "\\\\192.168.5.6\\log\\freeswitch.log.2010-06-20-18-54-29.1"};
            Array.Sort(data, MyComparer);
        }

        private int MyComparer(string a, string b)
        {
            string[] aVals = a.Split(".".ToCharArray());
            string[] bVals = b.Split(".".ToCharArray());
            int aIndex = Array.IndexOf(aVals, "log");
            int bIndex = Array.IndexOf(bVals, "log");
            if (aIndex != -1 && (aIndex + 1) < aVals.Length && bIndex != -1 && (bIndex + 1) < bVals.Length)
            {
                string dtFormat = "yyyy-MM-dd-HH-mm-ss";
                DateTime aDT, bDT;
                if (DateTime.TryParseExact(aVals[aIndex + 1], dtFormat, null, System.Globalization.DateTimeStyles.None, out aDT))
                {
                    if (DateTime.TryParseExact(bVals[bIndex + 1], dtFormat, null, System.Globalization.DateTimeStyles.None, out bDT))
                    {
                        return aDT.CompareTo(bDT); // sort based on date values
                    }
                }
            }
            return a.CompareTo(b); // something was wrong with formatting; revert to string comparison
        }

Open in new window

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
*Note that the code in tgerbert's example works because the dates have been formatted with leading zeroes, military time has been used, and the order of the values lends itself to a straight STRING comparison.  If the order and format of the dates was different it probably wouldn't work...just keep that in mind if the format changes or you need to do a similar thing with a different project.

My code is actually converting the "date/time" strings to DateTime instances using the specified format so they can be compared correctly as DateTimes instead of as strings.
0
 
Todd GerbertIT ConsultantCommented:
I  should also point out my example also assumes it's safe to just ignore the first n characters, if one of the filenames happens to start with an IP address with more chars that logic breaks.

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now