首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >允许重复键的C#可排序集合

允许重复键的C#可排序集合
EN

Stack Overflow用户
提问于 2011-04-19 20:35:20
回答 16查看 84K关注 0票数 108

我正在写一个程序来设置各种对象将出现在报告中的顺序。顺序是Excel电子表格中的Y位置(单元格)。

下面是代码的演示部分。我想要完成的是拥有一个集合,它将允许我添加多个对象,并且我可以获得一个基于序列的有序集合

代码语言:javascript
复制
SortedList list = new SortedList();

Header h = new Header();
h.XPos = 1;
h.name = "Header_1";
list.Add(h.XPos, h);

h = new Header();
h.XPos = 1;
h.name = "Header_2";
list.Add(h.XPos, h);

我知道SortedList不会允许这样做的,所以我一直在寻找替代方案。我不想消除的重复项,并且已经尝试了List<KeyValuePair<int, object>>

谢谢。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2011-04-20 17:49:47

非常感谢你的帮助。在搜索更多的过程中,我找到了这个解决方案。(在Stackoverflow.com中的其他问题中可用)

首先,我创建了一个类,它将封装类的对象(页眉、页脚等)。

代码语言:javascript
复制
public class MyPosition
{
    public int Position { get; set; }
    public object MyObjects{ get; set; }
}

所以这个类应该保持对象,并且每个对象的PosX都是int位置

代码语言:javascript
复制
List<MyPosition> Sequence= new List<MyPosition>();
Sequence.Add(new MyPosition() { Position = 1, Headerobject });
Sequence.Add(new MyPosition() { Position = 2, Headerobject1 });
Sequence.Add(new MyPosition() { Position = 1, Footer });

League.Sort((PosA, PosB) => PosA.Position.CompareTo(PosB.Position));

最终我得到的是排序后的“序列”列表。

票数 4
EN

Stack Overflow用户

发布于 2014-02-20 00:23:49

使用您自己的IComparer!

正如在其他答案中所述,您应该使用自己的比较器类。为此,我使用了一个通用的IComparer类,它适用于任何实现IComparable的类:

代码语言:javascript
复制
/// <summary>
/// Comparer for comparing two keys, handling equality as beeing greater
/// Use this Comparer e.g. with SortedLists or SortedDictionaries, that don't allow duplicate keys
/// </summary>
/// <typeparam name="TKey"></typeparam>
public class DuplicateKeyComparer<TKey>
                :
             IComparer<TKey> where TKey : IComparable
{
    #region IComparer<TKey> Members

    public int Compare(TKey x, TKey y)
    {
        int result = x.CompareTo(y);

        if (result == 0)
            return 1; // Handle equality as being greater. Note: this will break Remove(key) or
        else          // IndexOfKey(key) since the comparer never returns 0 to signal key equality
            return result;
    }

    #endregion
}

您将在实例化新的SortedList、SortedDictionary等时使用它:

代码语言:javascript
复制
SortedList<int, MyValueClass> slist = new SortedList<int, MyValueClass>(new DuplicateKeyComparer<int>());

这里int是可以重复的键。

票数 90
EN

Stack Overflow用户

发布于 2011-04-19 20:55:47

您可以安全地使用List<>。该列表有一个Sort方法,该方法的重载接受IComparer。你可以创建你自己的排序类。下面是一个例子:

代码语言:javascript
复制
private List<Curve> Curves;
this.Curves.Sort(new CurveSorter());

public class CurveSorter : IComparer<Curve>
{
    public int Compare(Curve c1, Curve c2)
    {
        return c2.CreationTime.CompareTo(c1.CreationTime);
    }
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5716423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档