关于使用List的问题

时间:2010-12-14 08:04:55

标签: c# list dictionary .net-2.0

我创建了一个像这样的列表

List<Dictionary<DicKeyCla, DicValCla>>

public Class DicKeyCla
{
   public EnKey1 DicKeyItem1,
   public EnKey2 DicKeyItem2,
}

public enum EnKey1 
{
   A1,
   A2,
   A3,
   A4,
   A5
}

public enum EnKey2 
{
   B11,
   B12,
   B13,
   B14,
   B15,
   B16,
   B17,
   B18,
   B19,
}

据我所知,List类有contains()方法。

如果我调用的函数包含DicKeyCla A3成员,例如B15和{{1}}。

如何快速从顶级列表中挑选完整的词典成员?

我需要对字典成员进行更多操作。

3 个答案:

答案 0 :(得分:1)

List.Contains方法只检查您发送的参数是否是列表中的项目。

如果您希望能够从此数据结构中找到包含某些给定A3B15的完整字典,则必须自行实现。

您可以执行类似管理内部字典的操作,该字典可以保持从各种A3 / B15 / etc对象映射到已添加它们的字典列表。

如果O(1)搜索对您不是很重要,请考虑简化优于性能,并且只扫描列表。

答案 1 :(得分:1)

这是简单的方法:

public static Dictionary<DicKeyCla, DicValCla>
     FindDict(List<Dictionary<DicKeyCla, DicValCla>> haystack,
              DicKeyCla needle)
{
    foreach (Dictionary<DicKeyCla, DicValCla> dict in haystack)
        if (dict.ContainsKey(needle))
            return dict;
    return null;
}

给定一个字典列表和一个键,它将返回具有该键的第一个字典,如果列表中没有,则返回null。

或者更一般地说:

public static IDictionary<TKey, TValue>
     FindDict<TKey, TValue>(IEnumerable<IDictionary<TKey, TValue>> haystack,
                            TKey needle)
{
    foreach (IDictionary<TKey, TValue> dict in haystack)
        if (dict.ContainsKey(needle))
            return dict;
    return null;
}

如果您需要经常进行此查找或列表很长,您可能需要使用Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>>索引您的密钥,该Dictionary<DicKeyCla, List<Dictionary<DicKeyCla, DicValCla>>>包含哪个字典包含哪个密钥。如果多个词典可以包含相同的键,那么您需要Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index = new Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>>(); foreach (Dictionary<DicKeyCla, DicValCla> dict in list) foreach (KeyValuePair<DicKeyCla, DicValCla> item in dict) index[item.Key] = dict; // or in LINQ Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index = (from dict in list from item in dict select new { item.Key, dict }) .ToDictionary(e => e.Key, e => e.dict); 来存储索引。

如果您已有列表并想要创建索引,则可以执行以下操作:

public static Dictionary<DicKeyCla, DicValCla>
     FindDict(Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index,
              DicKeyCla needle)
{
    Dictionary<DicKeyCla, DicValCla> result;
    index.TryGetValue(needle, out result);
    return result;
}

以下是您使用索引的方式:

{{1}}

答案 2 :(得分:1)

我有一种奇怪的感觉(但我可能错了)你用List包装你的字典希望你可以用Contains方法搜索字典的1个实例,你想要的只是通过a访问字典成员EnKey1和EnKey2的组合。像这样:

public struct Key // note the struct...
{
    public static Key A(EnKey1 k1, EnKey2 k2)
    {
       Key k = new Key();
       k.Key1 = k1;
       k.Key2 = k2;
       return k;
    }
    public EnKey1 Key1;
    public EnKey2 Key2;
}


Dictionary<Key, string> dic = new Dictionary<Key, string>();
dic.Add(Key.A(EnKey1.A1,EnKey2.B19), "test");
Console.WriteLine(dic[Key.A(EnKey1.A1,EnKey2.B19)]); 
// outputs "test"
// then you can do:
// dic.ContainsKey(Key.A(EnKey1.A1,EnKey2.B19)) -> true
// dic.ContainsKey(Key.A(EnKey1.A2,EnKey2.B19)) -> false