Permalänk

[C#/Linq] Sortera List<>

Håller på med ett projekt för Windows Phone och har lite problem med att få till en alfabetisk sortering av en List<> med hjälp av linq.

Struntar jag i raden som är markerad så laddas xml-filen in precis som den är.

Med den så funkar det dock inte alls, men kunde svurit på att det är så man gör i linq...

C#:

var vStudent = from s in doc.Descendants("Student") orderby s.Element("FirstName") ascending // OBS! FUNKAR EJ select new Word(s);

Datakällan är en xml-fil med följande struktur:
XML:

<?xml version="1.0" encoding="utf-8" ?> <Students> <Student> <FirstName>Johan</FirstName> <English>Ericsson</LastName> </Student> <Student> <FirstName>Anders</FirstName> <English>Andersson</LastName> </Student> <Student> <FirstName>Peder</FirstName> <LastName>Bertilsson</LastName> </Student> </Students>

Jag skickar med hela funktionen och lite mer kod om det skulle vara till hjälp:

private void btnSortDictionary_Click(object sender, RoutedEventArgs e) { IsolatedStorageFile.GetUserStoreForApplication().DeleteFile("Database.xml"); LoadDatabase2(); } private void LoadDatabase2() { // Create: Instantiates new WordList m_dbList = new WordList(); // Set: Url to xml m_dbList.LoadAndSort_FirstCol("Database.xml"); lvData.ItemsSource = m_dbList; } public void LoadAndSort_FirstCol(string strXMLFile) { IsolatedStorageFile isfData = IsolatedStorageFile.GetUserStoreForApplication(); XDocument doc = null; IsolatedStorageFileStream isfStream = null; if (isfData.FileExists(strXMLFile)) { isfStream = new IsolatedStorageFileStream(strXMLFile, FileMode.Open, isfData); doc = XDocument.Load(isfStream); isfStream.Close(); } else { doc = XDocument.Load(strXMLFile); isfStream = new IsolatedStorageFileStream(strXMLFile, FileMode.CreateNew, isfData); doc.Save(isfStream); isfStream.Close(); } var vStudent = from s in doc.Descendants("Student") orderby s.Element("FirstName") ascending // OBS! FUNKAR EJ select new Word(s); this.Clear(); AddRange(vStudent); }

Visa signatur

Bro!

Permalänk

Vad blir det för fel då? Och ascending kan du ta bort, det är default.

Visa signatur

www.uu.se - some kind of university | www.hirr.org.uk - ain't no mountain high enough | www.bajenfans.se

Permalänk

Får du "At least one object must implement icomparable" är det för att du jämför på elementet, och inte elementets värde.

var hej = from s in doc.Descendants("Student") orderby s.Element("FirstName").Value select s;

Provade din xml, och jag hoppas du inte kör med den du har pejstat in, det är inte precis valid xml

Visa signatur

www.uu.se - some kind of university | www.hirr.org.uk - ain't no mountain high enough | www.bajenfans.se

Permalänk
Medlem

du skulle även kunna köra sorteringen efteråt.

vStudent.Sort(delegate(objext x, object y) { //här får man göra en cast eller skicka in student-objekt istället för objects return x.FirstName.CompareTo(y.FirstName); });

Jag tycker även att den där xml:en ser lite skum ut.

<FirstName>Anders</FirstName>
<English>Andersson</LastName>

Ska det vara så?

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue

Permalänk

Tack för tipsen Jag kom dock på en annan lösning i natt som funkade också:

var vStudent = from s in doc.Descendants("Student") select new Word(s); var testStudent = from s in vStudent orderby s.FirstName select s;

Ang. xml'en så är det en felskrivning av mig när jag postade den här. Försökte göra ett tydligare exempel, helt enkelt

Visa signatur

Bro!