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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!