【问题标题】:Sorting a Dictionary in C# by name and date as key? [duplicate]在 C# 中按名称和日期作为键对字典进行排序? [复制]
【发布时间】: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

标签: c# class datetime dictionary


【解决方案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 我根据您的评论修改了代码。一开始没有得到您的订购规则。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2011-11-22
  • 2013-03-14
  • 2021-02-02
  • 2021-06-28
  • 2011-07-08
  • 2020-05-26
  • 2020-06-09
相关资源
最近更新 更多