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 u in ULibArray order by u.Artist select u;
-
Assuming
uLibs
is anIEnumerable<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 aSort
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 wellKrakerjak : 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.