using System;
using System.Collections.Generic;
using System.Text;
namespace mylib.collection.generic
{
/// <summary>
/// The DictionaryBuilder is used to create a dictionary, its value is a domain object,
/// its key is assumed to be the domain object's property or can be worked out base on the domain object.
/// NOTE: The reduplicate key will be ignore.
/// </summary>
/// <typeparam name="TKey">the key can identify the domain object</typeparam>
/// <typeparam name="TValue">the type of domain object</typeparam>
public class DictionaryBuilder<TKey, TValue>
{
private ICollection<TValue> _values;
public delegate TKey GetKey(TValue obj);
public DictionaryBuilder(ICollection<TValue> values)
{
_values = values;
}
/// <summary>
/// NOTE: The reduplicate key will be ignore.
/// </summary>
public Dictionary<TKey, TValue> toDictionary(GetKey getKey)
{
Dictionary<TKey, TValue> result = new Dictionary<TKey, TValue>();
buildDictionary(result, getKey);
return result;
}
public SortedDictionary<TKey, TValue> toSortedDictionary(GetKey getKey)
{
SortedDictionary<TKey, TValue> result = new SortedDictionary<TKey, TValue>();
buildDictionary(result, getKey);
return result;
}
/// <summary>
/// for toDictionary() and toSortedDictionary use.
/// </summary>
private void buildDictionary(IDictionary<TKey, TValue> arg, GetKey getKey)
{
foreach (TValue eachValue in _values)
{
TKey key = getKey(eachValue);
if (!arg.ContainsKey(key))
{
arg.Add(key, eachValue);
}
}
}
public Dictionary<TKey, List<TValue>> toGroupedDictionary(GetKey getKey)
{
Dictionary<TKey, List<TValue>> result = new Dictionary<TKey, List<TValue>>();
foreach (TValue eachValue in _values)
{
TKey key = getKey(eachValue);
if ( ! result.ContainsKey(key)) // 第一次遍历到某 key
{
List<TValue> newList = new List<TValue>();
newList.Add(eachValue);
result.Add(key, newList);
}
else // 不是第一次遍历到某 key
{
result[key].Add(eachValue);
}
}
return result;
}
} // class DictionaryBuilder
} // namespace mylib.collection.generic
用法:using System.Collections.Generic;
using System.Text;
namespace mylib.collection.generic
{
/// <summary>
/// The DictionaryBuilder is used to create a dictionary, its value is a domain object,
/// its key is assumed to be the domain object's property or can be worked out base on the domain object.
/// NOTE: The reduplicate key will be ignore.
/// </summary>
/// <typeparam name="TKey">the key can identify the domain object</typeparam>
/// <typeparam name="TValue">the type of domain object</typeparam>
public class DictionaryBuilder<TKey, TValue>
{
private ICollection<TValue> _values;
public delegate TKey GetKey(TValue obj);
public DictionaryBuilder(ICollection<TValue> values)
{
_values = values;
}
/// <summary>
/// NOTE: The reduplicate key will be ignore.
/// </summary>
public Dictionary<TKey, TValue> toDictionary(GetKey getKey)
{
Dictionary<TKey, TValue> result = new Dictionary<TKey, TValue>();
buildDictionary(result, getKey);
return result;
}
public SortedDictionary<TKey, TValue> toSortedDictionary(GetKey getKey)
{
SortedDictionary<TKey, TValue> result = new SortedDictionary<TKey, TValue>();
buildDictionary(result, getKey);
return result;
}
/// <summary>
/// for toDictionary() and toSortedDictionary use.
/// </summary>
private void buildDictionary(IDictionary<TKey, TValue> arg, GetKey getKey)
{
foreach (TValue eachValue in _values)
{
TKey key = getKey(eachValue);
if (!arg.ContainsKey(key))
{
arg.Add(key, eachValue);
}
}
}
public Dictionary<TKey, List<TValue>> toGroupedDictionary(GetKey getKey)
{
Dictionary<TKey, List<TValue>> result = new Dictionary<TKey, List<TValue>>();
foreach (TValue eachValue in _values)
{
TKey key = getKey(eachValue);
if ( ! result.ContainsKey(key)) // 第一次遍历到某 key
{
List<TValue> newList = new List<TValue>();
newList.Add(eachValue);
result.Add(key, newList);
}
else // 不是第一次遍历到某 key
{
result[key].Add(eachValue);
}
}
return result;
}
} // class DictionaryBuilder
} // namespace mylib.collection.generic
IList<NsHanbaiHead> hanbaiHeads = loadFromDs();
Dictionary<string, NsHanbaiHead> result = new DictionaryBuilder<string, NsHanbaiHead>(hanbaiHeads).toDictionary(
delegate(NsHanbaiHead hanbaiHead)
{
return hanbaiHead.seiban.ToString();
});
return result;
Dictionary<string, NsHanbaiHead> result = new DictionaryBuilder<string, NsHanbaiHead>(hanbaiHeads).toDictionary(
delegate(NsHanbaiHead hanbaiHead)
{
return hanbaiHead.seiban.ToString();
});
return result;