سؤال

Is it possible to sort a generic list on arbitrary property alphanumerically in c#? Let me know if the question is not clear and I will come up with an example.

Thanks in advance

Note: I have found this link that does it but not alphanumerically. Can anyone help me out? http://blog.codewrench.net/2009/04/14/sorting-a-generic-list-on-arbitrary-property/

هل كانت مفيدة؟

المحلول

here is a fast alphanumeric sort (can be used for other sorts with numerics too).

C# Alphanumeric Sorting http://www.dotnetperls.com/alphanumeric-sorting

public class AlphanumComparatorFast : IComparer
{
    public int Compare(object x, object y)
    {
    string s1 = x as string;
    if (s1 == null)
    {
        return 0;
    }
    string s2 = y as string;
    if (s2 == null)
    {
        return 0;
    }

    int len1 = s1.Length;
    int len2 = s2.Length;
    int marker1 = 0;
    int marker2 = 0;

    // Walk through two the strings with two markers.
    while (marker1 < len1 && marker2 < len2)
    {
        char ch1 = s1[marker1];
        char ch2 = s2[marker2];

        // Some buffers we can build up characters in for each chunk.
        char[] space1 = new char[len1];
        int loc1 = 0;
        char[] space2 = new char[len2];
        int loc2 = 0;

        // Walk through all following characters that are digits or
        // characters in BOTH strings starting at the appropriate marker.
        // Collect char arrays.
        do
        {
        space1[loc1++] = ch1;
        marker1++;

        if (marker1 < len1)
        {
            ch1 = s1[marker1];
        }
        else
        {
            break;
        }
        } while (char.IsDigit(ch1) == char.IsDigit(space1[0]));

        do
        {
        space2[loc2++] = ch2;
        marker2++;

        if (marker2 < len2)
        {
            ch2 = s2[marker2];
        }
        else
        {
            break;
        }
        } while (char.IsDigit(ch2) == char.IsDigit(space2[0]));

        // If we have collected numbers, compare them numerically.
        // Otherwise, if we have strings, compare them alphabetically.
        string str1 = new string(space1);
        string str2 = new string(space2);

        int result;

        if (char.IsDigit(space1[0]) && char.IsDigit(space2[0]))
        {
        int thisNumericChunk = int.Parse(str1);
        int thatNumericChunk = int.Parse(str2);
        result = thisNumericChunk.CompareTo(thatNumericChunk);
        }
        else
        {
        result = str1.CompareTo(str2);
        }

        if (result != 0)
        {
        return result;
        }
    }
    return len1 - len2;
    }
}

usage

var unordered = new[] { "100F", "50F", "SR100", "SR9" };
var ordered = unordered.OrderBy(s => s, new AlphanumComparatorFast());

and here is a nice article about the problem:

Sorting for Humans : Natural Sort Order http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

نصائح أخرى

Assuming that by "alphanumerically", you mean such a sorting:

01a
02a
02b
0a
1a
1b
a
b
c
...

You could use the OrderBY method of LINQ:

IEnumerable<T> myObjects = myObjects.OrderBy(x => x.SomeProperty);

EDIT based on PO inputs:

Unfortunately, that won't work simply the way you want it (100F 50F SR100 SR9 goes to 50F 100F SR9 SR100). But you could use the overloaded OrderBy and implement your desired IComparer.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top