Wednesday, April 13, 2011

How would I sort through an array of structs?

I have a struct containing song data:

public struct uLib
    {
        public string Path;
        public string Artist;
        public string Title;
        public string Album;
        public string Length;
    }

My library consists of an array of this uLib. How would I sort this array by say Artist? Is there a native sort function I can call on this type of array, or will I have to "roll my own"?

From stackoverflow
  • from u in ULibArray order by u.Artist select u;

  • Assuming uLibs is an IEnumerable<T>, you can try this:

    uLibs.OrderBy(i => i.Artist)
    

    This sorts the uLib instances by using a key; in this case, you've selected Artist to be the key to compare against. Similar sorting is possible against your other fields.

    erikkallen : You'll lose the result if you do this, though. The correct way do do this is var orderedLibs = uLibs.OrderBy(i => i.Artist)
    John Feminella : Yes, this is meant to be included as part of another statement. What you do with the result is up to you, of course.
  • First of all, that should not be a struct. It's larger than 16 bytes, so you don't get the performance benefits of having a struct. Also, it doesn't represent a single value, so it doesn't make sense semantically to make it a struct. Just make it a class instead.

    The Array class has a Sort method that you can use:

    Array.Sort(theArray, (x,y) => string.Compare(x.Artist,y.Artist));
    

    If you don't have C# 3 you use a delegate instead of the lambda expression:

    Array.Sort(theArray, delegate(uLib x, uLib y) { return string.Compare(x.Artist,y.Artist) } );
    

    Edit:
    Here's an example of what your data could look like as a class:

    public class ULib {
    
        private string _path, _artist, _title, _album, _length;
    
        public string Path { get { return _path; } set { _path = value; } }
        public string Artist { get { return _artist; } set { _artist = value; } }
        public string Title { get { return _title; } set { _title = value; } }
        public string Album { get { return _album; } set { _album = value; } }
        public string Length { get { return _length; } set { _length = value; } }
    
        public ULib() {}
    
        public ULib(string path, string artist, string title, string album, string length) {
           Path = path;
           Artist = artist;
           Title = title;
           Album = album;
           Length = length;
        }
    
    }
    

    In C# there there is a short form for a property. Instead of writing code for a private variable and a setter and getter to access it, this creates that automatically:

    public string Path { get; set; }
    
    Chris S : public class ULib as well
    Krakerjak : That works great. Thanks. You say I shouldn't use a struct, how would you organize this kind of data?
    Jon Skeet : Put it in the class - and use properties instead of public fields, too.
    Krakerjak : Guffa - Thanks for clarifying. Would that get sorted the same way?
    Guffa : Yes, only slightly faster as there is 80% less data to move around. :)
    Krakerjak : OK, thanks again. I'll give that a go.
  • Doesn't http://stackoverflow.com/questions/620534/sort-array-of-items-using-orderby answer your question ?

    Regards Friedrich

  • This codeproject article is a good tutorial on arrays, structs and some general guidance

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.