在 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# 中按名称和日期作为键对字典进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章