Get the next KeyValuePair<,> from a Dictionary<,> without index
在没有
例如,假设我有以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
从那里,我应该如何继续获得具有
在给出的例子和我想做的地方,
更详细的一点,我使用这个
这就是这个问题的切入点。我从一个服务器收到一个位置列表,这个列表必须保存。处理完这个列表后,我将每个位置与地图上的
此时,每当用户单击
字典中的顺序是不确定的。
参见:字典中元素的顺序
但是,您可以使用
在c中,
如果需要对元素进行排序,可以使用
也许您只需要枚举所有元素,在这种情况下,您应该这样做:
1 2 3 4 5 | foreach (var kvp in dictionary) { if ("String D".Equals(kvp.Value)) ; //do stuff } |
如果您需要能够按关键字和值进行搜索,那么不同的结构可能更适合。例如,请参见此处
问题编辑后:
编辑让它变得有趣,这应该对你有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | class SortedBiDcit<T1, T2> //this assumes T1 and T2 are different (and not int for indexer) and values are unique { Dictionary<T1, Tuple<T2, int>> dict1 = new Dictionary<T1, Tuple<T2, int>>(); Dictionary<T2, T1> dict2 = new Dictionary<T2, T1>(); List<T1> indices = new List<T1>(); public int Count { get { return indices.Count; } } public T2 this[T1 arg] { get { return dict1[arg].Item1; } } public T1 this[T2 arg] { get { return dict2[arg]; } } public Tuple<T1, T2> this[int index] { get { T1 arg1 = indices[index]; return new Tuple<T1, T2>(arg1, dict1[arg1].Item1); } } public void Add(T1 arg1, T2 arg2) { dict1[arg1] = new Tuple<T2, int>(arg2, indices.Count); dict2[arg2] = arg1; indices.Add(arg1); } public void Remove(T1 arg) { var arg2 = dict1[arg]; dict1.Remove(arg); dict2.Remove(arg2.Item1); indices.RemoveAt(arg2.Item2); } public void Remove(T2 arg) { var arg2 = dict2[arg]; var arg1 = dict1[arg2]; dict1.Remove(arg2); dict2.Remove(arg1.Item1); indices.RemoveAt(arg1.Item2); } } |
号
它缺乏基本的错误检查,但您可以从中获得它。它应该允许您这样使用它:
1 2 3 4 5 6 7 8 9 |
希望有帮助!
从技术上讲,有一种方法可以在字典中找到值的索引。
作为一个
1 2 3 4 |
。
选择要查找的值的索引(或所有索引,如果存在重复项)。
不过,我不建议这样做,因为
(编辑:或
我想你应该使用
.NET小提琴示例
在示例中,我使用索引或值作为索引。
源代码的.NET引用
更新使用这个的主要参数是当您想从值中提取键时,因为这是您想要的…我认为这对你很有用!
因为
也许你想要的是
你的
1 2 3 4 5 6 |
更新后
为什么不创建一个类呢?
1 2 3 4 5 | class A { Marker; Location; } |
。
当用户点击它时,你应该得到A,而不是标记。
这个问题实际上有一个相当简单的解决方案——虽然不是很好,但它确实起到了作用。
在这种情况下,我试图从
但是
考虑到这一点,我可以创建这样的扩展:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | public static KeyValuePair<K, V> After<K, V>( this Dictionary<K, V> dictionary, K key ) { Int32 position = dictionary.Keys.ToList().IndexOf( key ); if( position == -1 ) throw new ArgumentException("No match.","key" ); position++; if( position >= dictionary.Count ) position = 0; K k = dictionary.Keys.ToList()[ position ]; V v = dictionary.Values.ToList()[ position ]; return new KeyValuePair<K, V>( k, v ); } public static KeyValuePair<K, V> After<K, V>( this Dictionary<K, V> dictionary, V value ) { Int32 position = dictionary.Values.ToList().IndexOf( value ); if( position == -1 ) throw new ArgumentException("No match.","value" ); position++; if( position >= dictionary.Count ) position = 0; K k = dictionary.Keys.ToList()[ position ]; V v = dictionary.Values.ToList()[ position ]; return new KeyValuePair<K, V>( k, v ); } public static KeyValuePair<K, V> Before<K, V>( this Dictionary<K, V> dictionary, K key ) { Int32 position = dictionary.Keys.ToList().IndexOf( key ); if( position == -1 ) throw new ArgumentException("No match.","key" ); position--; if( position < 0 ) position = dictionary.Count - 1; K k = dictionary.Keys.ToList()[ position ]; V v = dictionary.Values.ToList()[ position ]; return new KeyValuePair<K, V>( k, v ); } public static KeyValuePair<K, V> Before<K, V>( this Dictionary<K, V> dictionary, V value ) { Int32 position = dictionary.Values.ToList().IndexOf( value ); if( position == -1 ) throw new ArgumentException("No match.","value" ); position--; if( position < 0 ) position = dictionary.Count - 1; K k = dictionary.Keys.ToList()[ position ]; V v = dictionary.Values.ToList()[ position ]; return new KeyValuePair<K, V>( k, v ); } |
。
这个扩展适合我需要的。
有了这个,我就可以得到任何给定的
你可以在这里查看。