2012-06-13 16 views
0

我想有List<MyObject> myList参考字典myDic值...我已经试过如何使用列表<T>来引用字典值?

myList = myDic.Values.ToList() 

但这似乎只复制字典中的值。我需要列表来引用字典,所以对myDic所做的任何修改(添加,删除,更新)都会反映在myList中。

+2

您已经词典 - 如果你需要两个键和值,为什么尝试将其转换为'List'? – Oded

+0

,因为该列表实际上是一个我编写的绑定到datagridview的异步绑定列表。我希望在字典上执行数据修改是因为查找速度,并将结果反映在我的绑定列表中,绑定列表绑定到我的网格 –

回答

5

这是不可能的。 myDic.Values是一个IEnumerable<MyObject>,它将枚举字典中的值。通过在其上调用.ToList(),您明确要求请求复制。如果你省略了这个调用,那么你将拥有一个你可以使用的枚举,但是当然你将无法直接编制索引或改变它。

考虑直接使用从myDic.Values检索到的IEnumerable<MyObject>而不是 - 是什么让你觉得你需要一个List<MyObject>

+0

,因为列表实际上是一个我编写的绑定到datagridview的异步绑定列表。我想在字典上执行数据修改,因为查找速度快,结果反映在我的绑定列表中,绑定到我的网格 –

+0

那么,'BindingList '发出一个事件时,它被修改,以便视图绑定到该列表可以自行更新。 'Dictionary '没有任何这样的事件。为了按照你想要的方式工作,你可能必须编写你自己的'BindingDictionary '类,它将存储委托给'Dictionary ',并且在任何时候引发适当的事件改变。 – cdhowie

+0

当我不得不通过列表遍历列表找到修改或删除的项目 –

0

当然,你可以使用,而不是你的列表实现有两全其美的好东西 的ObservableDictionary:which can be found here

如果你需要一个列表和字典,需要两者不具有的缺点同步每次字典发生变化时都会复制新的副本,为什么不为此写一个类?

这里一个简单的例子,这可能是不适合线程问题:

public class DictRefList 
{ 
    private Dictionary<int, SomeRefClass> dict; 
    private List<SomeRefClass> list; // your list implementation here 

    public void DictRefList() 
    { 
     dict = new Dictionary<int, SomeRefClass>(); 
     list = new List<SomeRefClass>; 
    } 

    public void Add(int key, SomeRefClass val) 
    { 
     dict.Add(key, val); 
     list.Add(val); 
    } 

    public void Delete(int key, SomeRefClass val) 
    { 
     dict.Remove(key); 
     list.Remove(val); 
    } 

    public void Update(int key, SomeRefClass val) 
    { 
     dict[key] = val; 
     list.Add(val); // do what is necessary to keep it valid and have no duplicate value 
    } 
} 
+0

感谢Mare!这是一个好主意!我只是一个入门级的开发人员,所以我仍然学习在盒子外面思考!我会给出一些想法,看看它的去向。看起来可能是我在找的东西。至少它可能会让我的上司离开我的我**一天的大声笑! –

+0

欢迎您! ObservableDictionary是强大的。 –

+0

我刚才看到,完整的实现可以在这里获得:http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c。aspx,如果你喜欢这个想法,随时可以upvote /接受它;) –

相关问题