【问题标题】:Question on using List关于使用列表的问题
【发布时间】:2010-12-14 08:04:55
【问题描述】:

我创建了一个这样的列表

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 成员,如 A3B15

如何快速从顶级列表中挑出整个字典成员?

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

【问题讨论】:

  • 不,这不是ArrayList,而是List&lt;T&gt;ArrayList 已过时。
  • 据我了解.. 你也许一开始有一个 Dictionary 来存储值,然后用 List 包装它只是为了能够使用它包含搜索您拥有的 1 个字典实例的方法?!

标签: c# list dictionary .net-2.0


【解决方案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&lt;DicKeyCla, Dictionary&lt;DicKeyCla, DicValCla&gt;&gt; 来索引您的键,该Dictionary&lt;DicKeyCla, Dictionary&lt;DicKeyCla, DicValCla&gt;&gt; 包含哪个字典包含哪个键。如果多个字典可以包含相同的键,那么您将需要一个 Dictionary&lt;DicKeyCla, List&lt;Dictionary&lt;DicKeyCla, DicValCla&gt;&gt;&gt; 来存储您的索引。

如果您已经有了列表并想创建索引,您可以这样做:

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;
}

【讨论】:

  • 问题被标记为 .net-2.0 -> no linq
  • m0sa:谢谢,我没注意到。我修复了它以提供非 LINQ 选项。
【解决方案2】:

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

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

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

如果 O(1) 搜索对您来说不是很重要,请考虑优先考虑简单性而不是性能,然后只扫描列表。

【讨论】:

    【解决方案3】:

    我有一种奇怪的感觉(但我可能错了)你用 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
    

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多