views:

613

answers:

5

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"?

+1  A: 

from u in ULibArray order by u.Artist select u;

John Saunders
A: 

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.

John Feminella
You'll lose the result if you do this, though. The correct way do do this isvar orderedLibs = uLibs.OrderBy(i => i.Artist)
erikkallen
Yes, this is meant to be included as part of another statement. What you do with the result is up to you, of course.
John Feminella
+12  A: 

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; }
Guffa
public class ULib as well
Chris S
That works great. Thanks. You say I shouldn't use a struct, how would you organize this kind of data?
Krakerjak
Put it in the class - and use properties instead of public fields, too.
Jon Skeet
Guffa - Thanks for clarifying. Would that get sorted the same way?
Krakerjak
Yes, only slightly faster as there is 80% less data to move around. :)
Guffa
OK, thanks again. I'll give that a go.
Krakerjak
A: 

Doesn't http://stackoverflow.com/questions/620534/sort-array-of-items-using-orderby answer your question ?

Regards Friedrich

Friedrich
A: 

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

Chris S