none
Inhalte in einer Dropdownliste sortieren RRS feed

  • Frage

  • Hi , ich habe folgende Strings (beispielhaft) die ich in eine Dropdownliste schreibe.
    Wie kann ich diese jetzt am besten sortieren?
    z.B. die Zeichenfolgen die Zahlen und Buchstaben enthalten sollten erst nach den Zahlen und denn nach den ersten Buchstaben sortiert werden.

    444
    22
    10ap9292121
    14bb9929299

    9aab99999

    282838282
    4929292
    1111
    30ca939392

    Mittwoch, 26. März 2014 07:27

Antworten

  • Hi Mike,
    hier mal eine kleine Demo, wie ich es verstanden habe:

    Markup:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
        <div>
          <asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# Liste %>" />
        </div>
      </form>
    </body>
    </html>

    Und der CodeBehind dazu:

    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    
    namespace WebApplication1
    {
      public partial class WebForm1 : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          Liste = GetData();
        }
        protected override void OnPreRender(EventArgs e)
        {
          this.DataBind();
          base.OnPreRender(e);
        }
        public List<Data> Liste { get; set; }
        List<Data> GetData()
        {
          List<Data> l = new List<Data>();
          foreach (var item in "444;22;10ap9292121;14bb9929299;9aab99999;282838282;4929292;1111;30ca939392".Split(';'))
          {
            l.Add(new Data() { Zeile = item });
          }
          l.Sort();
          return l;
        }
      }
    
      public class Data : IComparable<Data>
      {
        public string Zeile { get; set; }
        public override string ToString()
        {
          return Zeile;
        }
        public int CompareTo(Data other)
        {
          Regex reg = new Regex("\\d+");
          var d1 = reg.Match(Zeile).Value;
          var d2 = reg.Match(other.Zeile).Value;
          int i1 = 0;
          int i2 = 0;
          int.TryParse(d1, out i1);
          int.TryParse(d2, out i2);
          if (i1 != i2) return i1.CompareTo(i2);
          return Zeile.CompareTo(other.Zeile);
        }
      }
    }

    --
    Peter

    Montag, 31. März 2014 05:17

Alle Antworten

  • Hi Mike,
    die einfachste Lösung ist, die Elemente in einer sortierbaren Liste zu halten, dies Liste sortieren und dann an die DropDown-Liste binden.

    --
    Peter

    Mittwoch, 26. März 2014 07:51
  • Hi Peter, das hatte ich schon probiert. Aber da wird nur nach den Zahlen sortiert.
    Mittwoch, 26. März 2014 16:49
  • Hi Mike,
    sortiert wird, wenn nichts anderes angegeben wurde, entsprechend dem Typ des darzustellenden Objektes, in Deinem Fall eine Zeichenkette. Dieses wird von links nach rechts betrachtet, wobei Ziffern "kleiner" als Buchstaben sind und deshalb zuerst stehen.

    Wenn Du es anders haben willst, dann musst Du die Daten in einer Liste von Objekten halten und dem Typ (Klasse für die Objekte) einen "Vergleicher" (Comparer) spendieren. Dieser Comparer wird beim Sortieren für jedes Objekt aufgerufen und er bestimmt, welches der beiden vom Sortieralgorithmus bereitgestellten Objekte als kleiner bzw. größer zu betrachten ist.

    --
    Peter

    Mittwoch, 26. März 2014 19:19
  • Hi Mike,
    hier mal eine kleine Demo, wie ich es verstanden habe:

    Markup:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
        <div>
          <asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# Liste %>" />
        </div>
      </form>
    </body>
    </html>

    Und der CodeBehind dazu:

    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    
    namespace WebApplication1
    {
      public partial class WebForm1 : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          Liste = GetData();
        }
        protected override void OnPreRender(EventArgs e)
        {
          this.DataBind();
          base.OnPreRender(e);
        }
        public List<Data> Liste { get; set; }
        List<Data> GetData()
        {
          List<Data> l = new List<Data>();
          foreach (var item in "444;22;10ap9292121;14bb9929299;9aab99999;282838282;4929292;1111;30ca939392".Split(';'))
          {
            l.Add(new Data() { Zeile = item });
          }
          l.Sort();
          return l;
        }
      }
    
      public class Data : IComparable<Data>
      {
        public string Zeile { get; set; }
        public override string ToString()
        {
          return Zeile;
        }
        public int CompareTo(Data other)
        {
          Regex reg = new Regex("\\d+");
          var d1 = reg.Match(Zeile).Value;
          var d2 = reg.Match(other.Zeile).Value;
          int i1 = 0;
          int i2 = 0;
          int.TryParse(d1, out i1);
          int.TryParse(d2, out i2);
          if (i1 != i2) return i1.CompareTo(i2);
          return Zeile.CompareTo(other.Zeile);
        }
      }
    }

    --
    Peter

    Montag, 31. März 2014 05:17
  • Hi,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.

    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Freitag, 4. April 2014 13:18