【问题标题】:C# Get dictionary key by value where value is of struct typeC#按值获取字典键,其中值是结构类型
【发布时间】:2015-04-02 16:32:18
【问题描述】:

请告诉我这是否可行以及如何获得。

In C# I have a struct like:

public struct FrmData{
int num;
int x;
Timer t;
}

我使用的不是字典,其中 value 是那个结构。

public Dictionary<int, FrmData> dictionary;

当我的 Timer t 结束时,他会引发事件

public void eventHandlerTick(object sender, EventArgs e){
switch(key){case 1:break;}
}

我的问题是:我能以某种方式从引发此事件的计时器中获取字典的键吗?! 谢谢你

【问题讨论】:

  • object sender 应该是计时器。您可以将 Timer 本身用作字典 Dictionary&lt;Timer, FrmData&gt; 中的键,因此可以通过 dictionary[sender as Timer] 获取表单数据
  • 如果你使用struct,你不应该有一个可变结构,尽管在这种情况下你根本不应该使用struct,因为你的值在概念上不是表示单个值。
  • 我不能使用 Timer 作为键,必须是一个结构作为值,因为这个结构是示例。我的真实结构有更多的数据,而 Timer 必须是其中之一。我是 C# 新手,目前不知道另一种解决方法。我需要这个快。不过谢谢。
  • @DraženkaLadišić 事实上,您是实际类型有更多数据,这使得该类型更适合作为一个类,而不是struct。
  • 可能,但正如我所说,我对此完全陌生,结构是我首先想到的。但谢谢你的建议。下次我将使用类。

标签: c# dictionary struct timer key


【解决方案1】:

这样做的唯一方法是遍历键值对,检查每对的值以查看它是否与您的计时器匹配。

类似:

Timer t = sender as Timer;
foreach(var kvp in dictionary){ // Could also do KeyValuePair<int, FrmData> instead of var
    if(kvp.Value.Timer == t)
    {
         int key = kvp.Key
         // Do something with the key
    }
}

public struct FrmData
{
    int num;
    int x;
    Timer t;

    public Timer Timer
    {
        get { return t; }
    }
}

编辑

我最初的回复假定您的字典结构是一成不变的。如果没有,Will 的评论将是更好的选择,因为它可以让您更有效地引用结构。

【讨论】:

  • 你能把这段代码写得更详细一点吗,不完全明白。我是 C# 新手,不知道如何编写 kvp.Value ?!.....
  • 对不起,代码是一个快速示例,所以我没有仔细检查它。 foreach 实际上是 foreach(var kvp in dictionary)。
  • 好的,现在我收到错误“运算符'=='不能应用于操作数 mystruct 和 System.Windows.Forms.Timer”:(
  • 对不起,我忘记写kvp.Value.timer
  • 抱歉,kvp.Value 提供了对结构的访问,因此您需要进一步深入了解计时器。为此,您需要编辑结构以通过提供属性或公开 Timer t 来提供对计时器的访问。我会更新一个例子。
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 2011-12-22
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多