我应该使用哪种集合类型?

时间:2013-01-07 22:34:58

标签: c# collections

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

让我们说在lb1中有4个元素,在lb2中是5个元素。

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

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

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

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

提前致谢 约翰

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

3 个答案:

答案 0 :(得分:1)

你可以使用Dictionary<string,string>来获得keyvalue,这也提供Remove()

的能力
 Dictionary<string, string> items = new Dictionary<string, string>();

 items.Remove("mykey");

答案 1 :(得分:1)

2个词典,1个用于lb1,1个用于lb2:

Dictionary<string, Dictionary<string,string>>

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

的所有值

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

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

dic2.removeAt("x");

答案 2 :(得分:0)

为什么不为密钥创建类:

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<YourKey, int>中使用它来存储所有值。

这样做的好处是只能存储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);
}