我很尴尬地问,但是在缓存(HttpRuntime.Cache
)中将键/值对数据添加到DataTable
的最佳方法是什么?
我目前正在将缓存中的键/值对数据转储到HashTable
,后者成为Repeater对象的DataSource
。不幸的是,我无法对HashTable
中的数据进行排序,因此认为DataTable
(作为Repeater的DataSource
)可以解决我的困境。
答案 0 :(得分:1)
您是否查看了SortedList Class或SortedDictionary Class
表示键/值的集合 按键排序的对 相关的IComparer<(Of<(T>)>) 实施
答案 1 :(得分:1)
如果您只想将缓存中的每个键/值对复制到DataTable
:
DataTable table = new DataTable();
table.Colums.Add("key", typeof(string));
table.Colums.Add("value", typeof(string));
foreach (DictionaryEntry entry in HttpRuntime.Cache)
{
table.Rows.Add(entry.Key, entry.Value);
}
这假设键和值都是string
类型,但如果不是这种情况,只需替换代码中第2行和第3行中提到的类型。
新创建的DataTable
可以使用以下代码绑定到Repeater
:
myRepeater.DataSource = table;
myRepeater.DataBind();
答案 2 :(得分:0)
您是否有理由不想将原始数据表存储在缓存中? (除了显而易见的高对象重量之外,我的意思是?)是否可以以只读方式在所有用户之间共享?如果是这样,它可能是以某种格式(也许是IDictionary?)缓存的一个很好的候选者。
答案 3 :(得分:0)
或者您可以创建自己的类,该类具有稍后将绑定到转发器的属性,并将它们添加到该类型的列表中,您可以通过linq轻松地对它们进行排序
//your data container class
public class MyClass
{
public string Name { get; set; }
}
//Put all classes into the list before caching it
List<MyClass> source = new List<MyClass>() ;
//use this to sort with any kind of data inside your own defined class
var sortedResult = source.OrderBy(x => x.Name);
答案 4 :(得分:0)
This should do the trick:
Sub Main() Handles Me.Load
Dim Hash As New Hashtable
Hash.Add("Tom", "Arnold")
Hash.Add("Sly", "Stallone")
HashToDataTable(Hash)
End Sub
Function HashToDataTable(ByVal Hash As Hashtable) As Data.DataTable
Dim Table As New Data.DataTable()
Table.Columns.Add("Key", GetType(String))
Table.Columns.Add("Value", GetType(Object)) 'You can use any type you want.
For Each Key In Hash.Keys
Table.Rows.Add(Key, Hash(Key))
Next
Return Table
End Function