8. 实现IDictionary<TKey, TValue>接口
由于前面实现了IDictionary接口,现在实现IDictionary<TKey, TValue>也就没什么困难的了,照葫芦画瓢。
首先改变类声明:
public
class
ReversibleSortedList
<
TKey, TValue
>
:IDictionary
<
TKey, TValue
>
IDictionary, IEnumerable
<
KeyValuePair
<
TKey, TValue
>>
, ICollection,
IEnumerable, ICollection
<
KeyValuePair
<
TKey, TValue
>>
然后实现ICollection<KeyValuePair<TKey, TValue>>接口成员:
bool
ICollection
<
KeyValuePair
<
TKey, TValue
>>
.IsReadOnly
{
get
{
return
false
;
}
}
void
ICollection
<
KeyValuePair
<
TKey, TValue
>>
.Add(
KeyValuePair
<
TKey, TValue
>
keyValuePair)
{
this
.Add(keyValuePair.Key, keyValuePair.Value);
}
bool
ICollection
<
KeyValuePair
<
TKey, TValue
>>
.Contains(
KeyValuePair
<
TKey, TValue
>
keyValuePair)
{
int
num1
=
this
.IndexOfKey(keyValuePair.Key);
if
((num1
>=
0
)
&&
EqualityComparer
<
TValue
>
.Default.Equals(
this
.values[num1],
keyValuePair.Value))
{
return
true
;
}
return
false
;
}
void
ICollection
<
KeyValuePair
<
TKey, TValue
>>
.CopyTo(
KeyValuePair
<
TKey, TValue
>
[] array,
int
arrayIndex)
{
if
(array
==
null
)
{
throw
new
ArgumentNullException(
"
array
"
);
}
if
((arrayIndex
<
0
)
||
(arrayIndex
>
array.Length))
{
throw
new
ArgumentOutOfRangeException(
"
arrayIndex
"
,
"
Need a non-negative number
"
);
}
if
((array.Length
-
arrayIndex)
<
this
.Count)
{
throw
new
ArgumentException(
"
ArrayPlusOffTooSmall
"
);
}
for
(
int
num1
=
0
; num1
<
this
.Count; num1
++
)
{
KeyValuePair
<
TKey, TValue
>
pair1;
pair1
=
new
KeyValuePair
<
TKey, TValue
>
(
this
.keys[num1],
this
.values[num1]);
array[arrayIndex
+
num1]
=
pair1;
}
}
bool
ICollection
<
KeyValuePair
<
TKey, TValue
>>
.Remove(
KeyValuePair
<
TKey, TValue
>
keyValuePair)
{
int
num1
=
this
.IndexOfKey(keyValuePair.Key);
if
((num1
>=
0
)
&&
EqualityComparer
<
TValue
>
.Default.Equals(
this
.values[num1], keyValuePair.Value))
{
this
.RemoveAt(num1);
return
true
;
}
return
false
;
}
需要注意,Count属性和Clear方法都是共用方法,不需要再次实现。
接下来实现IDictionary<TKey, TValue>接口,它是最主要的接口,所有成员均为公有的,前面我们已经实现了Add、ContainsKey方法,这里不再列出:
ICollection
<
TKey
>
IDictionary
<
TKey, TValue
>
.Keys
{
get
{
return
this
.GetKeyListHelper();
}
}
ICollection
<
TValue
>
IDictionary
<
TKey, TValue
>
.Values
{
get
{
return
this
.GetValueListHelper();
}
}
public
TValue
this
[TKey key]
//
Item属性,就是索引器
{
get
{
TValue local1;
int
num1
=
this
.IndexOfKey(key);
if
(num1
>=
0
)
{
return
this
.values[num1];
}
else
{
local1
=
default
(TValue);
return
local1;
}
}
set
{
if
(key
==
null
)
{
throw
new
ArgumentNullException(
"
key
"
);
}
int
num1
=
Array.BinarySearch
<
TKey
>
(
this
.keys,
0
,
this
._size, key,
this
._sortDirectionComparer);
if
(num1
>=
0
)
{
this
.values[num1]
=
value;
this
.version
++
;
}
else
{
this
.Insert(
~
num1, key, value);
}
}
}
public
bool
Remove(TKey key)
{
int
num1
=
this
.IndexOfKey(key);
if
(num1
>=
0
)
{
this
.RemoveAt(num1);
}
return
(num1
>=
0
);
}
public
bool
TryGetValue(TKey key,
out
TValue value)
{
int
num1
=
this
.IndexOfKey(key);
if
(num1
>=
0
)
{
value
=
this
.values[num1];
return
true
;
}
value
=
default
(TValue);
return
false
;
}
另外需要添加一个RemoveAt方法:
//
移除指定索引元素
public
void
RemoveAt(
int
index)
{
if
((index
<
0
)
||
(index
>=
this
._size))
{
throw
new
ArgumentOutOfRangeException(
"
index
"
,
"
Index out of range
"
);
}
this
._size
--
;
if
(index
<
this
._size)
{
Array.Copy(
this
.keys, (
int
)(index
+
1
),
this
.keys, index,
(
int
)(
this
._size
-
index));
Array.Copy(
this
.values, (
int
)(index
+
1
),
this
.values, index,
(
int
)(
this
._size
-
index));
}
this
.keys[
this
._size]
=
default
(TKey);
this
.values[
this
._size]
=
default
(TValue);
this
.version
++
;
}
最后,进行测试,这一次不再使用int做为键,而改用string:
static
void
Main()
{
ReversibleSortedList
<
string
,
string
>
rs
=
new
ReversibleSortedList
<
string
,
string
>
();
//
添加元素
rs.Add(
"
3
"
,
"
a
"
);
rs.Add(
"
1
"
,
"
b
"
);
rs.Add(
"
2
"
,
"
c
"
);
rs.Add(
"
6
"
,
"
d
"
);
rs.Add(
"
5
"
,
"
e
"
);
rs.Add(
"
4
"
,
"
f
"
);
//
使用DictionaryEntry打印键/值
foreach
(KeyValuePair
<
string
,
string
>
d
in
rs)
{
Console.WriteLine(d.Key
+
"
"
+
d.Value);
}
Console.WriteLine(
"
删除索引为“2”的“5”的元素
"
);
rs.Remove(
"
2
"
);
rs.Remove(
"
5
"
);
foreach
(KeyValuePair
<
string
,
string
>
d
in
rs)
{
Console.WriteLine(d.Key
+
"
"
+
d.Value);
}
}
ReversibleSortedList 0.7版本:实现IDictionary<TKey, TValue>接口
完整代码下载
运行结果:
1 b
2 c
3 a
4 f
5 e
6 d
删除索引为“2”的“5”的元素
1 b
3 a
4 f
6 d