在 C# 中按名称和日期作为键对字典进行排序? [复制]

Posted

技术标签:

【中文标题】在 C# 中按名称和日期作为键对字典进行排序? [复制]【英文标题】:Sorting a Dictionary in C# by name and date as key? [duplicate] 【发布时间】:2018-11-23 23:12:34 【问题描述】:

大家好,我需要你的帮助。我在大学有一项关于对字典进行排序的任务。 它的属性是:

Dictionary<string, Book> nameAndDate = new Dictionary<string, Book>(); 类 Book 的属性:

 class Book

    public string NAME;
    public string Date;
    public DateTime DateAsDate;
    public Book(string bookName , string date,DateTime dateAsDate)
    
        this.NAME = bookName;
        this.Date = date;
        this.DateAsDate = dateAsDate;
    

所以我的问题是如何通过升序对键进行排序,这样当我给书起名字和日期时,它会这样写

HP1 -> 26.06.1997
HP7 -> 21.07.2007
AC -> 20.11.2009

【问题讨论】:

@BossRoss 您链接的问题是针对Python,这可能与问题的C# 标记完全不同。 你的字典的关键字是什么? 您不能对 Dictionary 进行排序,也不能按 Key 以外的任何方式对 SortedDictionary 进行排序。您可以从字典中获取已排序的(无论如何)值列表。因为.Values给你一个很普通的列表。您没有在此处指定您的实际期望。 这本书的名字和它的值是日期,重点是当你添加一些名字和日期时,它会被添加到字典中,然后你按值升序打印它们,我只是当值是日期时,不明白我该怎么做 实际上字典速度很快,因为它们使用散列而不是实际的键来查找项目。基于散列的排序是非常无用的,你永远不应该依赖你的字典被排序。如果您需要这个,请改用SortedDictionary 【参考方案1】:

您可以使用LINQ 以您想要的方式订购您的词典。例如,在下面的代码中,我按日期然后按名称对您的书籍字典进行排序,以便获得相同的输出:

using System;
using System.Linq;
using System.Collections.Generic;

namespace ConsoleApp5

class Book

    public string Name;
    public DateTime Date;
    public Book(string bookName, DateTime dateAsDate)
    
        this.Name = bookName;
        this.Date = dateAsDate;
    


class Program

    static void Main(string[] args)
    
        var nameAndDate = new Dictionary<string, Book> 
            "HP1", new Book("HP1", new DateTime(1997,6,26)) ,
            "HP7", new Book("HP1", new DateTime(2007,7,21)) ,
            "AC", new Book("AC", new DateTime(2009,11,20)) ,
        ;

        foreach (var book in nameAndDate.OrderBy(b => b.Value.Date).ThenBy(b => b.Value.Name))
        
            Console.WriteLine($"book.Key -> book.Value.Date.ToString("dd.MM.yyyy")");
        
        Console.ReadKey();
    


【讨论】:

这样排序很容易,我忘了包括我的输入。差不多就是这样:AC OBowden PenguinBooks 20.11.2009 0395082555 14.00 | HP1 JKRowling Bloomsbury 26.06.1997 0395082777 15.50 | HP7 JKRowling Bloomsbury 21.07.2007 0395082666 20.00 | @asidis "by name and date" - 你没有包含日期​​部分。 我觉得很明显 @Marto99 我根据您的评论修改了代码。一开始没有得到您的订购规则。

以上是关于在 C# 中按名称和日期作为键对字典进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::string 作为字典顺序的键对 unordered_map 进行排序

使用字典中的键对对象数组进行排序

在python中按日期时间对字典列表进行排序

在Python 3.4中按日期对字典列表进行排序[重复]

按值然后键对字典进行排序

根据键对 Python 字典进行排序? [复制]