我有一个自定义类的数组列表,它基本上有两个属性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);
编辑:我需要先按键排序,然后将值作为第二个标准
答案 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
方法,但这需要一些尴尬的箍才能使用比较器。
顺便提一下,类名和公共字段/属性应分别大写(MyClass
和Key
。)
答案 2 :(得分:2)
为什么不使用Dictionary<key, value>?它可以让你通过钥匙抓住任何东西。您也可以通过类的方法独立访问键。如果你使用像字符串这样的内置类型,那么排序比较器就已经存在了。
编辑:对于这种情况,上面的内容是错误。但我要离开它表明词典不在这里工作。
另一个建议:您可以使用类似SortedList<Key, List<Value>>的内容,这样您的列表将始终排序。唯一需要注意的是插入时间大于常规列表的插入时间。
答案 3 :(得分:1)
您可以使用Array.AsList(array)将数组转换为List,并使用类似
的linqlist.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)