C# LINQ-将字典中DateTime值最早的元素设置为空

C# LINQ-将字典中DateTime值最早的元素设置为空,c#,.net,linq,.net-3.5,c#-3.0,C#,.net,Linq,.net 3.5,C# 3.0,我有一个字典,其中XMLMessage是一个结构: private struct XMLMessage { public string Message { get; set; } public DateTime TimeRead { get; set; } } 我将使用与此类似的词典: storedMessages["1X"] = new XMLMessage() { Message = "<XML>1X</XML>

我有一个
字典
,其中XMLMessage是一个结构:

    private struct XMLMessage
    {
        public string Message { get; set; }
        public DateTime TimeRead { get; set; }
    }
我将使用与此类似的词典:

storedMessages["1X"] = new XMLMessage() { Message = "<XML>1X</XML>", TimeRead = DateTime.Now };
storedMessages["1Y"] = new XMLMessage() { Message = "<XML>1Y</XML>", TimeRead = DateTime.Now };
谢谢

更新:我想我可以这样做,但我想听听你的意见

var j = storedMessages.Where(x => x.Key.Contains("1")).OrderByDescending(s => s.Value.TimeRead).First().Key;
storedMessages[j] = new XMLMessage();

是的,你的更新版本看起来还不错——尽管我想说你最好按照时间顺序和字典一样存储一个列表,这样生活会更轻松

但我强烈建议您不要使用可变结构。要么使用类,要么将结构更改为不可变

使其成为类的示例:

private class XmlMessage
{
    public string Message { get; set; }
    public DateTime TimeRead { get; set; }
}
使其成为不可变结构的示例:

private struct XmlMessage
{
    private readonly string message;
    private readonly DateTime timeRead;

    public string Message { get { return message; } }
    public DateTime TimeRead { get { return timeRead; } }

    public XmlMessage(string message, DateTime timeRead)
    {
        this.message = message;
        this.timeRead = timeRead;
    }
}

当然,您可以将其改为不可变类…

它选择的是哪一项?这对我来说是可行的…你考虑过使用SortedDictionary吗?要添加到storedMessages字典中的传入消息是否总是按时间顺序发送:即,您永远不希望添加日期时间早于已添加到字典中的任何先前日期时间的消息?如果传入的消息是连续的,那么我认为使用带有简单递增计数器的SortedDictionary作为键意味着您将始终在列表的开头有“最早的条目”;当您将该条目的DateTime值设置为空时,您将前进一个计数器变量,这样您就有了一个指向最旧条目的指针。@BillW:有没有理由不将其作为答案?@JSkeet,因为我没有亲自在代码中测试过这个想法。。。阅读《C#indepth》让我确信我是一个无知的人(对此我非常感谢!):)最好的是,我对这两方面都不确定——你能解释更多或者提供一个例子吗
private struct XmlMessage
{
    private readonly string message;
    private readonly DateTime timeRead;

    public string Message { get { return message; } }
    public DateTime TimeRead { get { return timeRead; } }

    public XmlMessage(string message, DateTime timeRead)
    {
        this.message = message;
        this.timeRead = timeRead;
    }
}