随笔 - 123  文章 - 24 评论 - 2701 阅读 - 101万

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   1-2-3  阅读(352)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示