第一次泛型编程(以前从来也只有用过List<T>之类的)
不知道会有什么问题呢?继承IList的部分没有注释了,MSDN可以查的。欢迎提意见噢~
你可能会看到下面的类用多种方式实现了同样的效果,有多态,有模版,还有包装wrapper(不知道是不是恰当)……还用了泛型……
实际项目中,如果有可取之处,请只取其中一种就可以了……(计划中……)
补充一张VS自动生成的类图
using System;
using System.Collections.Generic;
using System.Collections;
![](/Images/OutliningIndicators/None.gif)
namespace CA_PairCollection
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 基础格式化机制
/// </summary>
/// <typeparam name="T"></typeparam>
interface IFormat<T>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
T GetFormat();
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 格式化模板接口
/// </summary>
interface IFormatTemplate
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Text模版,形如:"Text = "
/// </summary>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string TextTemplate
{ get;set;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// Value模版,形如:"Value = "
/// </summary>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string ValueTemplate
{ get;set;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 分隔符模版,形如:","
/// </summary>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string Separator
{ get;set;}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 提供用于格式化对象的模板的格式化机制
/// </summary>
interface IFormatProvider
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string GetFormat(IFormatTemplate formatTemplate);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 格式化模板类
/// </summary>
class FormatTemplate : IFormatTemplate
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public FormatTemplate(string textTemplate,string separator,string valueTemplate)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.textTemplate = textTemplate;
this.separator = separator;
this.valueTemplate = valueTemplate;
}
![](/Images/OutliningIndicators/InBlock.gif)
private string textTemplate;
private string separator;
private string valueTemplate;
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormatTemplate 成员#region IFormatTemplate 成员
![](/Images/OutliningIndicators/InBlock.gif)
public string TextTemplate
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.textTemplate;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.textTemplate = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public string ValueTemplate
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.valueTemplate;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.valueTemplate = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public string Separator
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.separator;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.separator = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 成对参数类
/// </summary>
/// <typeparam name="U"></typeparam>
/// <typeparam name="V"></typeparam>
class Pair<U, V> : IFormat<string>, IFormatProvider
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public Pair()
{ }
public Pair(U text, V value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.text = text;
this.value = value;
}
![](/Images/OutliningIndicators/InBlock.gif)
private U text;
public U Text
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.text;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
private V value;
public V Value
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.value;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.value = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormat 成员#region IFormat<string> 成员
![](/Images/OutliningIndicators/InBlock.gif)
public virtual string GetFormat()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return "Text = " + this.Text.ToString() + "; Value = " + this.Value.ToString();
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormatProvider 成员#region IFormatProvider 成员
![](/Images/OutliningIndicators/InBlock.gif)
public virtual string GetFormat(IFormatTemplate formatTemplate)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return formatTemplate.TextTemplate + this.Text.ToString()
+ formatTemplate.Separator
+ formatTemplate.ValueTemplate + this.Value.ToString();
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 成对参数类集合
/// </summary>
/// <typeparam name="U"></typeparam>
/// <typeparam name="V"></typeparam>
class PairCollection<U, V> : IList<Pair<U, V>>, IFormat<string>, IFormatProvider
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private IList<Pair<U, V>> pairs;
![](/Images/OutliningIndicators/InBlock.gif)
public PairCollection()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
pairs = new List<Pair<U, V>>();
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IListPairU,V 成员#region IList<Pair<U,V>> 成员
![](/Images/OutliningIndicators/InBlock.gif)
public int IndexOf(Pair<U, V> item)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.pairs.IndexOf(item);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Insert(int index, Pair<U, V> item)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs.Insert(index,item);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void RemoveAt(int index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs.RemoveAt(index);
}
![](/Images/OutliningIndicators/InBlock.gif)
public Pair<U, V> this[int index]
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.pairs[index];
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs[index]=value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
ICollectionPairU,V 成员#region ICollection<Pair<U,V>> 成员
![](/Images/OutliningIndicators/InBlock.gif)
public void Add(Pair<U, V> item)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs.Add(item);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Clear()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs.Clear();
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool Contains(Pair<U, V> item)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.pairs.Contains(item);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void CopyTo(Pair<U, V>[] array, int arrayIndex)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.pairs.CopyTo(array,arrayIndex);
}
![](/Images/OutliningIndicators/InBlock.gif)
public int Count
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.pairs.Count;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool IsReadOnly
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.IsReadOnly;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public bool Remove(Pair<U, V> item)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.Remove(item);
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IEnumerablePairU,V 成员#region IEnumerable<Pair<U,V>> 成员
![](/Images/OutliningIndicators/InBlock.gif)
public IEnumerator<Pair<U, V>> GetEnumerator()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return this.pairs.GetEnumerator();
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IEnumerable 成员#region IEnumerable 成员
![](/Images/OutliningIndicators/InBlock.gif)
IEnumerator IEnumerable.GetEnumerator()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return (IEnumerator)GetEnumerator();
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormat 成员#region IFormat 成员
![](/Images/OutliningIndicators/InBlock.gif)
public virtual string GetFormat()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string result = string.Empty;
foreach (Pair<U, V> p in this.pairs)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
result = result + p.GetFormat() + "\r\n";
}
return result;
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormatProvider 成员#region IFormatProvider 成员
![](/Images/OutliningIndicators/InBlock.gif)
public string GetFormat(IFormatTemplate formatTemplate)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string result = string.Empty;
foreach (Pair<U, V> p in this.pairs)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
result = result + p.GetFormat(formatTemplate) + "\r\n";
}
return result;
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 实现了中文式成对参数的类
/// </summary>
/// <typeparam name="U"></typeparam>
/// <typeparam name="V"></typeparam>
sealed class ChinesePair<U, V> : Pair<U, V>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public ChinesePair()
: base()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ }
public ChinesePair(U text,V value)
: base(text, value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ }
public override string GetFormat()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return "文本 = " + this.Text.ToString() + "; 值 = " + this.Value.ToString();
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 实现了英文式成对参数的类
/// </summary>
/// <typeparam name="U"></typeparam>
/// <typeparam name="V"></typeparam>
sealed class EnglishPair<U, V> : Pair<U, V>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
public EnglishPair()
: base()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ }
public EnglishPair(U text, V value)
: base(text, value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ }
public override string GetFormat()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return "Text = " + this.Text.ToString() + "; Value = " + this.Value.ToString();
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 键值均为string类型的一个类型包装
/// </summary>
class KVPairCollection : PairCollection<string, string>,IFormat<string>
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private PairCollection<string, string> p;
public KVPairCollection()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
p = new PairCollection<string, string>();
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IFormat 成员#region IFormat<string> 成员
![](/Images/OutliningIndicators/InBlock.gif)
string IFormat<string>.GetFormat()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return p.GetFormat();
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
class Program
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
static void Main(string[] args)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
//以下示例用多种方式实现了成对类的格式化输出
//
![](/Images/OutliningIndicators/InBlock.gif)
PairCollection<string, string> psBases = new PairCollection<string, string>();
psBases.Add(new Pair<string, string>("baseText1", "baseValue1"));
psBases.Add(new Pair<string, string>("baseText2", "baseValue2"));
foreach (Pair<string, string> p in psBases)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine(p.GetFormat());
}
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("----------------------");
![](/Images/OutliningIndicators/InBlock.gif)
PairCollection<string, string> psPloyStrings = new PairCollection<string, string>();
psPloyStrings.Add(new ChinesePair<string, string>("textChinese1", "valueChinese1"));
psPloyStrings.Add(new EnglishPair<string, string>("textEnglish1", "valueEnglish1"));
foreach (Pair<string, string> p in psPloyStrings)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine(p.GetFormat());
}
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("----------------------");
![](/Images/OutliningIndicators/InBlock.gif)
PairCollection<string, int> psPloyInts = new PairCollection<string, int>();
psPloyInts.Add(new ChinesePair<string, int>("textChinese1", 1));
psPloyInts.Add(new EnglishPair<string, int>("textEnglish1", 2));
foreach (Pair<string, int> p in psPloyInts)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine(p.GetFormat());
}
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("----------------------");
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(psPloyStrings.GetFormat());
Console.WriteLine(psPloyInts.GetFormat());
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("----------------------");
![](/Images/OutliningIndicators/InBlock.gif)
KVPairCollection kvs = new KVPairCollection();
kvs.Add(new ChinesePair<string, string>("textChinese1", "valueChinese1"));
kvs.Add(new EnglishPair<string, string>("textEnglish1", "valueEnglish1"));
kvs.Add(new Pair<string, string>("textBase1", "valueBase"));
Console.WriteLine(kvs.GetFormat());
![](/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine("----------------------");
![](/Images/OutliningIndicators/InBlock.gif)
PairCollection<string, string> pFormatProvider = new PairCollection<string, string>();
pFormatProvider.Add(new ChinesePair<string, string>("textChinese1", "valueChinese1"));
pFormatProvider.Add(new EnglishPair<string, string>("textEnglish1", "valueEnglish1"));
Console.WriteLine(pFormatProvider.GetFormat((IFormatTemplate)(new FormatTemplate("模版Text = "," ; ", "模版Value = "))));
}
}
}
![](/Images/OutliningIndicators/None.gif)