3

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

3 Answers 3

15

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; }
Sign up to request clarification or add additional context in comments.

6 Comments

That works great. Thanks. You say I shouldn't use a struct, how would you organize this kind of data?
Put it in the class - and use properties instead of public fields, too.
Guffa - Thanks for clarifying. Would that get sorted the same way?
Yes, only slightly faster as there is 80% less data to move around. :)
@Guffa: would you mind to provide the source of your claim that larger than 16 bytes => no perf gain? thanks
|
1

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

Comments

0

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.

2 Comments

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.