如何使用重复键对列表进行排序?

Lea*_*ner 12 c# generic-list .net-2.0 data-structures

我有一组元素/键,我正在从两个不同的配置文件中读取.因此,键可以是相同的,但具有与它们中的每一个相关联的不同值.

我想按排序顺序列出它们.我能做什么 ?我尝试了SortedList类,但它不允许重复键.

我该怎么做?

例如,假设我有3个元素,键1,2,3.然后我得到一个具有键2(但值不同)的元素.然后我希望新密钥在现有密钥2之后但在3之前插入.如果我在找到一个带有密钥2的元素,那么它应该在最近添加的密钥2之后.

请注意,我使用的是.NET 2.0

Dav*_*kle 12

我更喜欢使用LINQ来做这类事情:

using System.Linq;

...

var mySortedList = myList.Orderby(l => l.Key)
                         .ThenBy(l => l.Value);

foreach (var sortedItem in mySortedList) {
    //You'd see each item in the order you specified in the loop here.
}
Run Code Online (Sandbox Code Playgroud)

注意:您必须使用.NET 3.5或更高版本才能完成此操作.

  • @nealv:你可能想看看问题的编辑历史.您可能会注意到此信息最初不在问题文本中. (2认同)
  • 我以为你想要新添加的值具有相同的值来追踪列表中已有的键.这不会那样做.这将根据值对具有相等键值的项目进行排序. (2认同)

Nea*_*alv 9

你需要的是一个带有自定义IComparer的Sort函数.你现在拥有的是使用sort时的默认icomparer.这将检查字段值.

创建自定义IComparer时(通过实现Icomparable接口在您的类中执行此操作).它的作用是:你的对象将自己检查到你排序的列表中的每个其他对象.

这是由一个函数完成的.(不要担心VS会在引用你的界面时实现它

public class  ThisObjectCLass : IComparable{

    public int CompareTo(object obj) {
            ThisObjectCLass something = obj as ThisObjectCLass ;
            if (something!= null) 
                if(this.key.CompareTo(object.key) == 0){
                //then:
                   if .....
                }
                else if(this.value "is more important then(use some logic here)" something.value){
                 return 1
                }
                else return -1
            else
               throw new ArgumentException("I am a dumb little rabid, trying to compare different base classes");
        }
}
Run Code Online (Sandbox Code Playgroud)

阅读上面的链接以获取更多信息.

我知道在开始的时候我自己有些麻烦,所以对于任何额外的帮助添加评论我会详细说明


Lea*_*ner 7

我是通过创建一个来完成的SortedList<int, List<string>>.每当我找到重复键时,我只需将值插入与SortedList对象中已存在的键相关联的现有列表中.这样,我可以获得特定键的值列表.

  • 我知道SortedList和Lookup.但这些都是地图,而不是列表.C#中没有实际的排序列表.有`List.Sort()`,但是然后插入 - 然后 - 排序列表是一个`O(n log n)`操作,而它应该只是'O(log n)`或'O(n)`在最坏的情况下. (3认同)

Kna*_*bax 5

使用你自己的比较者课程! 如果排序列表中的键是整数,则可以使用例如此比较器:

public class DegreeComparer : IComparer<int>
{
    #region IComparer<int> Members

    public int Compare(int x, int y)
    {
        if (x < y)
            return -1;
        else
            return 1;
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

要使用int键和字符串值实现新的SortedList,请使用:

var mySortedList = new SortedList<int, string>(new DegreeComparer());
Run Code Online (Sandbox Code Playgroud)