排序数组结构列表(键值)C#

时间:2011-02-22 02:23:21

标签: c#

我有一个自定义类的数组列表,它基本上有两个属性Key和Value

public class myClass
{
    public key { get; set; }
    public value { get; set; }
}

ArrayList myList = new ArrayList();
// myList is a list of myClass

如何按键对myList进行排序?

我以前一直这样做,问题是我不能再使用它,因为它不处理重复键的情况,我不能在字典中有两个相同的键。

// pseudo code
loop and add to dictionary (Key, Value)  
sort dictionary  
Dictionary<string, string> sortedTypes = myList.
    OrderBy(i => i.Key).ToDictionary(i => i.Key, i => i.Value);

编辑:我需要先按键排序,然后将值作为第二个标准

6 个答案:

答案 0 :(得分:6)

首先:不要使用ArrayList。请改用通用类型List<myClass>

然后,只需使用List.Sort方法,传递适当的委托以用于比较。

list.Sort((x, y)=>x.key.CompareTo(y.key))

答案 1 :(得分:3)

如果myList改为List<myClass>,那么您可以这样做:

myList = myList.OrderBy(x => x.key).ToList();

您也可以在Sort本身使用List方法,但这需要一些尴尬的箍才能使用比较器。

顺便提一下,类名和公共字段/属性应分别大写(MyClassKey。)

答案 2 :(得分:2)

为什么不使用Dictionary<key, value>?它可以让你通过钥匙抓住任何东西。您也可以通过类的方法独立访问键。如果你使用像字符串这样的内置类型,那么排序比较器就已经存在了。

编辑:对于这种情况,上面的内容是错误。但我要离开它表明词典在这里工作。

另一个建议:您可以使用类似SortedList<Key, List<Value>>的内容,这样您的列表将始终排序。唯一需要注意的是插入时间大于常规列表的插入时间。

答案 3 :(得分:1)

您可以使用Array.AsList(array)将数组转换为List,并使用类似

的linq
list.OrderBy(x=> x.Key)

:)

答案 4 :(得分:1)

这是一个例子:

 public class EventAlarm
{
    List<EventProperty> propertyList = null;

    public EventAlarm()
    {
       propertyList = new List<EventProperty>();
    }

    public addProperty(string key, string value)
    {
        propertyList.Add(new EventProperty(key, value));
    }

    public sortProperty()
    {
        propertyList.Sort((x, y)=>x.key.CompareTo(y.key)) 
    }

}


private class EventProperty
{
    #region  Properties

    private string key;
    private string value;
    private bool isPropertyValid;

    public string Key
    {
        get { return key; }
        set { key = value; }
    }

    public string Value
    {
      get { return this.value; }
      set { this.value = value; }
    }

    public bool IsPropertyValid
    {
      get { return isPropertyValid; }
      set { isPropertyValid = value; }
    }

    #endregion  Properties

    #region Constructor

    public EventProperty(string key, string value)
    {
        this.Key = key;
        this.Value = Value;
    }

    #endregion Constructor

    #region Methods

    public void PropertyValidation()
    {
        // Here write Code ...
    }

    #endregion Methods
}

答案 5 :(得分:1)

如果您需要以List开头,您可以轻松转换为字典,然后按值排序:

objectList.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value)