leo*_*ora 5 c# collections datetime
如果我有一组日期和价值观.我希望得到的价值是:
噢,这是一个简单的例子.如果收集是:
Date Value
1/1/2009 100
1/1/2010 200
1/1/2011 300
Run Code Online (Sandbox Code Playgroud)
如果我正在寻找6/1/2010我会得到一个值250.我可以使用任何集合,如果一个更好的解决比其他(字典,数组等...)
小智 7
您可以使用List类型来保存对,对它们进行排序并使用List.BinarySearch.
例如,您可以使用以下内容:
struct Pair
{
public Pair(DateTime t, int v)
{
date = t;
value = v;
}
public DateTime date;
public int value;
}
....
List<Pair> pairs = new List<Pair>();
pairs.Add(new Pair(DateTime.Now, 100));
pairs.Add(new Pair(DateTime.Now, 200));
....
// Sort using the time.
pairs.Sort(delegate(Pair pair1, Pair pair2) {
return pair1.date.CompareTo( pair2.date);
}
);
// Do binary search.
int index = pairs.BinarySearch(new Pair(dateToSearch, 0),
delegate(Pair pair1, Pair pair2) {
return pair1.date.CompareTo(pair2.date);
});
if (index >= 0) {
// Found the element!
return pairs[index].value;
}
// If not found, List.BinarySearch returns the complement
// of the index where the element should have been.
index = ~index;
// This date search for is larger than any
if (index == pairs.Count) {
//
}
// The date searched is smaller than any in the list.
if (index == 0) {
}
// Otherwise return average of elements at index and index-1.
return (pairs[index-1].value + pairs[index].value)/2;
Run Code Online (Sandbox Code Playgroud)
当然代码不是最好的,但你明白了:使用List,对它进行排序,然后进行BinarySearch.
查找MSDN以获取更多信息.
列表:http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
List.Sort:http://msdn.microsoft.com/en-us/library/3da4abas.aspx
List.BinarySearch:http://msdn.microsoft.com/en-us/library/3f90y839.aspx
一个简单的排序(按日期)列表就足够了。只需找到小于或等于您要查找的日期(我们称之为 d )的最后一个日期(我们称之为d1 )。假设没有重复的日期,下一个日期d2将超过d 。
现在,如果值v1对应于d1,v2对应于d2,那么您要查找的值是v1 + ( v2 - v1 ) / ( d2 - d1 ) * ( d - d1 )。
| 归档时间: |
|
| 查看次数: |
4479 次 |
| 最近记录: |