C# 对字典进行排序<;字符串、浮点数>;按值降序排列-在.net 2.0中没有Linq

C# 对字典进行排序<;字符串、浮点数>;按值降序排列-在.net 2.0中没有Linq,c#,.net-2.0,C#,.net 2.0,如何在不使用Linq的情况下,仅使用.NET2.0中提供的功能,按值降序对通用字典(字符串、浮点)进行排序 请注意,我并不是要对值本身进行排序——键需要以某种方式连接到值。(否则,我会问如何对列表进行排序,对吗?如果您只需要一个已排序的浮点数组,这是符合.net 2的 var dict = new Dictionary<string,float>(); var values = new float[dict.Count]; dict.Values.CopyTo(values, 0);

如何在不使用Linq的情况下,仅使用.NET2.0中提供的功能,按值降序对通用字典(字符串、浮点)进行排序


请注意,我并不是要对值本身进行排序——键需要以某种方式连接到值。(否则,我会问如何对列表进行排序,对吗?

如果您只需要一个已排序的浮点数组,这是符合.net 2的

var dict = new Dictionary<string,float>();
var values = new float[dict.Count];
dict.Values.CopyTo(values, 0);
Array.Sort(values);
Array.Reverse(values);
var dict=newdictionary();
var值=新的浮动[dict.Count];
dict.Values.CopyTo(值,0);
数组。排序(值);
数组。反向(值);

私有类SortDesc:IComparer
{
int IComparer.Compare(对象a、对象b)
{
变量c1=(键值对)a;
var c2=(KeyValuePair)b;
如果(c1.值>c2.值)
返回-1;
返回c1.值
用法

var dict = new Dictionary<string, float>();
var result = new KeyValuePair<string, float>[dict.Count];
((ICollection<KeyValuePair<string, float>>)dict).CopyTo(result, 0);

var sortDesc = new SortDesc();      
Array.Sort(result, sortDesc);
var dict=newdictionary();
var结果=新的KeyValuePair[dict.Count];
((ICollection)dict.CopyTo(结果,0);
var sortDesc=新的sortDesc();
Sort(result,sortDesc);
免责声明:完全未经测试

我觉得我有责任指出,.NET2.0不再受支持,也不再发货

仅使用.net 2.0中提供的功能

假设您已经安装了VisualStudio的多目标软件包,那么在创建项目时应该能够针对特定的框架。您还可以通过项目的属性页更改目标框架

如果还需要指定支持的语言版本,可以通过单击“高级”按钮,通过“项目属性生成”选项卡进行设置。在这种情况下,选择ISO-2对应于作为VS2005的一部分与.Net 2.0一起发布的C#V2

如果您需要有关多重目标的信息,请参阅:

这样配置项目环境后,您将只能使用.NET2.0和C#2.0中提供的功能。这包括您将在对象浏览器中看到的内容

现在来看手头的问题,按值对
词典
内容进行排序

一种简单的方法是将键值对提取到支持排序的类中。下面的示例使用
列表
保存值。列表的排序方法被传递给定义比较逻辑的方法。如果值相等,比较逻辑设计为按值(降序)和按键(升序)进行排序

public void Test()
{
    Dictionary<string, float> dict = new Dictionary<string, float>();
    dict.Add("A1", 3);
    dict.Add("A2", 30);
    dict.Add("Z", 30);
    dict.Add("A3", 30);
    dict.Add("F", 5);

    List<KeyValuePair<string, float>> sorted = new List<KeyValuePair<string, float>>(dict);
    sorted.Sort(new Comparison<KeyValuePair<string, float>>(CompareKvp));
    foreach(KeyValuePair<string, float> kvp in sorted)
    {
        Console.WriteLine(kvp.ToString());
    }
}

private static Int32 CompareKvp(KeyValuePair<string, float> kvp1, KeyValuePair<string, float> kvp2)
{
    int ret = - kvp1.Value.CompareTo(kvp2.Value); // negate for descending
    if (ret == 0)
    {
        ret = kvp1.Key.CompareTo(kvp2.Key); // Ascend comp for Key
    }
    return ret; 
}

Sooooo,你意识到给字典分类没有任何意义吗?我猜最后你可能想要一个排序的浮点数组?请展示你所拥有的,这样你就可以从方法的
Linq.OrderBy()
中得到启发(按照代码流程向下一点,这是快速排序的部分)。@ina你想对字典进行排序吗?或者将字典的内容放入存储的新对象/数据结构中?我问,因为前者是不可能的,而后者是可能的。令人惊讶的是,即使.NET 2.0也有“SortedDictionary”,它允许在键(而不是值)上使用自定义比较器以降序排序条目,并且它也有OrderedDictionary,一个非泛型类型,允许按您喜欢的顺序插入对,但我没有看到一个好的泛型解决方案,允许按值排序(这似乎是一件很奇怪的事情)这不会对字典排序…?@rufus,确实不会:)现在添加第二种情况,但是我一直必须测试.net 2:/slaps head,在这里,我用艰苦的方式来做,制作模因和东西所有的准备工作都可以用
((ICollection)dict.CopyTo(result,0)来代替这看起来很可笑,但是Unity/Mono仍然在.NET2.0/Substan上。用另一种方法来测试.NET2的支持-抓取Unity好吧,所以我愚蠢的问题是。。。这本词典变成了一张单子了吗?为什么不保留一个字典呢?它实现了几个接口;其中之一是
IEnumerable
。其中一个]列表构造函数](接受IEnumerable作为列表源。“为什么不将其保留为字典?”-字典本身不支持排序,因此您的原始问题是。LINQ只是一组将IEnumerable用作项源的方法。我选择了一个
列表
,因为它包含一个排序方法。嗯,好的,那么有没有更好的方法返回字典,而不是创建一个新字典,然后在它显示的位置填充它
console.writeline
在上一个
foreach
中?目标是能够轻松地通过键访问值。
public void Test()
{
    Dictionary<string, float> dict = new Dictionary<string, float>();
    dict.Add("A1", 3);
    dict.Add("A2", 30);
    dict.Add("Z", 30);
    dict.Add("A3", 30);
    dict.Add("F", 5);

    List<KeyValuePair<string, float>> sorted = new List<KeyValuePair<string, float>>(dict);
    sorted.Sort(new Comparison<KeyValuePair<string, float>>(CompareKvp));
    foreach(KeyValuePair<string, float> kvp in sorted)
    {
        Console.WriteLine(kvp.ToString());
    }
}

private static Int32 CompareKvp(KeyValuePair<string, float> kvp1, KeyValuePair<string, float> kvp2)
{
    int ret = - kvp1.Value.CompareTo(kvp2.Value); // negate for descending
    if (ret == 0)
    {
        ret = kvp1.Key.CompareTo(kvp2.Key); // Ascend comp for Key
    }
    return ret; 
}
[A2, 30]
[A3, 30]
[Z, 30]
[F, 5]
[A1, 3]