Grant
Grant

Reputation: 11356

c# How to sort a sorted list by its value column

i have a generic sorted list "results" with key = some filename and value = boolean.

I would like to sort the list by the boolean entry or value column. does anyone know how i can do this?

Thanks!

Upvotes: 13

Views: 42108

Answers (4)

spender
spender

Reputation: 120450

SortedList is optimized so that inertions occur in an ordered fashion, such that enumeration occurs in a sorted order at minimal cost. Anything else requires a re-sort. Thus:

        SortedList<string,bool> l = new SortedList<string, bool>();
        l.Add("a", true);
        l.Add("b", false);
        l.Add("c", true);
        l.Add("d", false);
        var orderByVal = l.OrderBy(kvp => kvp.Value);

but this enumeration will be significantly slower to calculate, and be performed up-front, requiring extra storage to do so.

Depending on your situation it might be cheaper to maintain 2 SortedList instances with the key/value reversed.

Upvotes: 13

David Fawzy
David Fawzy

Reputation: 1076

Normally that sorted by the first key on the list so if you swap the key and value on the add, then match that on the binding that sample example i use and work fine

public static SortedList<string, string> GetCountries(string conn)
        {
            var dict = new SortedList<string, string>();
            dict.Add("","Select One");
            var sql = "SELECT [CountryID]      ,[Descr]  FROM [dbo].[Countries] Order By CountryID ";
            using (var rd = GetDataReader(conn, sql))
            {
                while (rd.Read())
                {
                    dict.Add(rd["Descr"].ToString(), rd["CountryID"].ToString());
                }
            }
            return dict;
        }

Dim List As SortedList(Of String, String) = VDB.CoreLib.DbUtils.GetCountries(connDB)

        ddlBankCountry.DataSource = List
        ddlBankCountry.DataTextField = "Key"
        ddlBankCountry.DataValueField = "Value"
        ddlBankCountry.DataBind()

Upvotes: 0

mansoor
mansoor

Reputation: 1613

For descending all list items

list.OrderByDescending(); 

or

var list = list.OrderByDescending(x => x.Product.Name)
                  .ThenBy(x => x.Product.Price).ToList();

Upvotes: 2

C-Pound Guru
C-Pound Guru

Reputation: 16368

In .NET 2.0, you could add your items to a SortedList:

  public static List<MyObject> SortedObjects(IEnumerable<MyObject> myList) {
     SortedList<string, MyObject> sortedList = new SortedList<string, MyObject>();
     foreach (MyObject object in myList) {
        sortedList.Add(object.ValueIWantToSort, object);
     }

     return new List<MyObject>(sortedList.Values);
  }

Upvotes: 2

Related Questions