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
用法:
IList<NsHanbaiHead> hanbaiHeads = loadFromDs();
Dictionary
<string, NsHanbaiHead> result = new DictionaryBuilder<string, NsHanbaiHead>(hanbaiHeads).toDictionary(
    
delegate(NsHanbaiHead hanbaiHead)
    {
        
return hanbaiHead.seiban.ToString();
    });

return result;
posted on 2008-05-28 19:44  1-2-3  阅读(352)  评论(0编辑  收藏  举报