首页 新闻 会员 周边

C# 有没有容器能在插入的时候自动排序

0
悬赏园豆:10 [已解决问题] 解决于 2023-05-23 14:05

我找了半天,貌似大部分容器都是对整体进行排序,
SortedList能实现类似的功能,但是它是键值对,键不能重复
有没有个类似List的容器,它能在Add数据的时候,按照顺序进行排序,即其内部有个插入排序的逻辑,保证最后得到的List数据总是有序的

C#
WmW的主页 WmW | 菜鸟二级 | 园豆:424
提问于:2023-05-22 18:36
< >
分享
最佳答案
0

可以用 SortedSet

var numbers = new SortedSet<int>();
numbers.Add(1);
numbers.Add(3);
numbers.Add(2);

foreach (var number in numbers)
{
    Console.WriteLine(number);    
}

// output:
// 1
// 2
// 3
收获园豆:7
dudu | 高人七级 |园豆:30994 | 2023-05-22 18:44

SortedSet会把相同的数据合并,有没有不会合并的啊

SortedSet<string> sl = new SortedSet<string>();
            sl.Add("aaa");
            sl.Add("aaa");
            sl.Add("bbb");
            sl.Add("ccc");
WmW | 园豆:424 (菜鸟二级) | 2023-05-23 09:15

@WmW: 可以自己实现 IComparer<T> 传给 SortedSet

var numbers = new SortedSet<int>(new DuplicateComparer<int>());
numbers.Add(1);
numbers.Add(3);
numbers.Add(3);
numbers.Add(2);

foreach (var number in numbers)
{
    Console.WriteLine(number);
}

// output:
// 1
// 2
// 3
// 3

public class DuplicateComparer<T> : IComparer<T>
    where T : IComparable
{
    public int Compare(T? x, T? y)
    {
        var result = x.CompareTo(y);
        return result == 0 ? 1 : result;
    }
}
dudu | 园豆:30994 (高人七级) | 2023-05-23 12:51

@dudu: 好的,感谢!

WmW | 园豆:424 (菜鸟二级) | 2023-05-23 14:04
其他回答(2)
0

在 C# 中,如果您想要在插入数据时自动进行排序的容器,可以使用 SortedSet<T> 类。SortedSet<T> 是一个有序集合,它在插入元素时会根据元素的值进行排序。

以下是使用 SortedSet<T> 的示例代码:

csharp
Copy code
SortedSet<int> sortedSet = new SortedSet<int>();

// 添加元素
sortedSet.Add(5);
sortedSet.Add(2);
sortedSet.Add(8);

// 输出排序后的元素
foreach (int item in sortedSet)
{
Console.WriteLine(item);
}
输出结果将按照升序排序:

Copy code
2
5
8
请注意,SortedSet<T> 不允许重复的元素。如果您需要处理重复元素,可以考虑使用 SortedDictionary<TKey, TValue> 类,它是基于键值对的有序字典。

收获园豆:1
Technologyforgood | 园豆:5633 (大侠五级) | 2023-05-22 23:20

SortedSet会把相同的数值合并,有么有不合并的啊

支持(0) 反对(0) WmW | 园豆:424 (菜鸟二级) | 2023-05-23 10:26
0

SortedList 可以传入一个IComparer<TKey> 对象. 自己实现这个, 如果 相等就返回1. 可以做到重复的key插在后面.

收获园豆:2
czd890 | 园豆:14412 (专家六级) | 2023-05-23 11:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册