【问题标题】:Which collection type should I use?我应该使用哪种集合类型?
【发布时间】:2013-01-07 22:34:58
【问题描述】:

我有三个 ListBox:lb1、lb2 和 lb3。

假设 lb1 中有 4 个元素,lb2 中有 5 个元素。

(lb1 和 lb2)的每个唯一组合都可以分配给 lb3 中的一个元素。

我想将这些组合和关联存储在一个集合中。 我的第一个想法是使用 KeyValuePair 和 Key = (lb1Element1_lb2Element1), Value = lb3Element1。

但是使用这个解决方案我会遇到问题。 假设我删除了 lb1Element1,没有选项(?)可以从 KeyValuePair-List 中删除所有其他出现 lb1Element1 的组合。

在这种情况下哪种集合类型最好?

提前致谢 约翰

编辑:所有 3 个列表框都包含数字。

【问题讨论】:

  • 你有 Dictionary 你有 List List> 你有 Array[] ArrayList 你需要更具体地说明你在这里想要什么约翰。你能举一些每个列表框将包含什么的例子吗?

标签: c# collections


【解决方案1】:

您可以只使用Dictionary<string,string> 作为键值,它还提供Remove() 的功能

 Dictionary<string, string> items = new Dictionary<string, string>();

 items.Remove("mykey");

【讨论】:

    【解决方案2】:

    2 个字典怎么样,1 个用于 lb1,1 个用于 lb2:

    Dictionary<string, Dictionary<string,string>>
    

    第一个dic:key是每个lb1的值,value是lb2的所有值(key和value相同的字典) 第二个dic:key是每个lb2的值,value是lb1的所有值

    如果您从 lb2 列表框中删除选项“x”,然后要查找已删除 lb2 值的所有连接 lb1 值,请从第一个 dic 中删除所有具有“x”作为 lb2 值的对,然后删除来自第二个 dic 的整个“x”键:

    Foreach(var lb1value in Dic2.ElementAt("x").value.keys)
      {
        Dic1.ElementAt("lb1value").
         value.RemoveAt("x");
      }
    
    dic2.removeAt("x");
    

    【讨论】:

    • 所有 3 个列表框都只包含数字。我忘记说了。对不起。但是如果我从 lb2 中删除一个元素会怎样。这个解决方案仅适用于将从 lb1 中删除的元素。 - 还是我错了?
    【解决方案3】:

    为什么不为密钥创建类:

    public class YourKey
    {
        public int Item1 { get; private set; }
        public int Item2 { get; private set; }
    
        public YourKey(int item1, int item2)
        {
           this.Item1 = item1;
           this.Item2 = item2;
        }
    
        public override bool Equals(object obj)
        {
            YourKey temp = obj as YourKey;
            if (temp !=null)
            {
                return temp.Item1 == this.Item1 && temp.Item2 == this.Item2;
            }
            return false;
        }
    
        public override int GetHashCode()
        {
            int hash = 37;
            hash = hash * 31 + Item1;
            hash = hash * 31 + Item2;
            return hash;
        }
    }
    

    然后您可以在Dictionary&lt;YourKey, int&gt; 中使用它来存储所有值。

    这样做的好处是只能存储 Item1 和 Item2 的每个组合的一个值。

    如果您想删除您的字典中所有条目 1 == 1 的条目:

    var entriesToDelete = yourDictionary.Where(kvp => kvp.Key.Item1 == 1).ToList();
    foreach (KeyValuePair<YourKey, int> item in entriesToDelete)
    {
        yourDictionary.Remove(item.Key);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2019-06-18
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多