using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MarketData.Numerical { public interface IBinValueExtractor { double BinValue(); } public class BinCollection : List> { } public class BinItems : List { public BinItems() { } public BinItems(List list) { foreach(T item in list)Add(item); } } public class BinHelper where T : IBinValueExtractor { public static BinCollection CreateBins(BinItems items,int bins) { BinCollection binCollection=new BinCollection(); if(null==items||0==items.Count) { for(int index=0;index()); return binCollection; } items.Sort(); T minItem=items[0]; T maxItem=items[items.Count-1]; double midPoint=(maxItem.BinValue()-minItem.BinValue())/(double)bins; List borderValues=new List(); for(int index=0;index()); for(int index=0;index binItems=binCollection[binCollection.Count-1]; lowerBound=borderValues[index]; if(index==borderValues.Count-1)upperBound=maxItem.BinValue(); else upperBound=borderValues[index+1]; for(int itemIndex=0;itemIndex=lowerBound&&item.BinValue()()); } return binCollection; } } }