এখানে নিউগেট থেকে ফাস্টমেম্বার ব্যবহার করে একটি দুর্দান্ত 2013 আপডেট রয়েছে :
IEnumerable<SomeType> data = ...
DataTable table = new DataTable();
using(var reader = ObjectReader.Create(data)) {
table.Load(reader);
}
এটি সর্বোচ্চ পারফরম্যান্সের জন্য ফাস্টমেম্বারের মেটা-প্রোগ্রামিং এপিআই ব্যবহার করে। আপনি যদি এটি নির্দিষ্ট সদস্যদের মধ্যে সীমাবদ্ধ রাখতে চান (বা আদেশটি প্রয়োগ করুন), তবে আপনি এটিও করতে পারেন:
IEnumerable<SomeType> data = ...
DataTable table = new DataTable();
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) {
table.Load(reader);
}
সম্পাদকের ডিস / দাবিদার: ফাস্টমেমার একটি মার্ক গ্র্যাভেল প্রকল্প। এর সোনার এবং পূর্ণ-উড়ে!
হ্যাঁ, এটি এর ঠিক বিপরীত এই এক; প্রতিফলন যথেষ্ট হবে - বা আপনার যদি দ্রুত প্রয়োজন হয়, HyperDescriptor
2.0 বা সম্ভবত Expression
3.5 এ। আসলে, HyperDescriptor
পর্যাপ্ত চেয়ে বেশি হওয়া উচিত।
উদাহরণ স্বরূপ:
// remove "this" if not on C# 3.0 / .NET 3.5
public static DataTable ToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for(int i = 0 ; i < props.Count ; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in data)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = props[i].GetValue(item);
}
table.Rows.Add(values);
}
return table;
}
এখন এক লাইনের সাহায্যে আপনি প্রতিবিম্বের তুলনায় এটিকে বহুগুণ দ্রুত করতে পারবেন ( HyperDescriptor
বস্তুর ধরণের জন্য সক্ষম করে T
)।
পুনরায় পারফরম্যান্স ক্যোয়ারী সম্পাদনা করুন; ফলাফল সহ একটি পরীক্ষার ছদ্মবেশ এখানে:
Vanilla 27179
Hyper 6997
আমার সন্দেহ হয় যে বাধাটি সদস্যের অ্যাক্সেস থেকে DataTable
পারফরম্যান্সে চলে এসেছে ... আমি সন্দেহ করি যে আপনি এতে আরও উন্নতি করবেন ...
কোড:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
public class MyData
{
public int A { get; set; }
public string B { get; set; }
public DateTime C { get; set; }
public decimal D { get; set; }
public string E { get; set; }
public int F { get; set; }
}
static class Program
{
static void RunTest(List<MyData> data, string caption)
{
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < 500; i++)
{
data.ToDataTable();
}
watch.Stop();
Console.WriteLine(caption + "\t" + watch.ElapsedMilliseconds);
}
static void Main()
{
List<MyData> foos = new List<MyData>();
for (int i = 0 ; i < 5000 ; i++ ){
foos.Add(new MyData
{ // just gibberish...
A = i,
B = i.ToString(),
C = DateTime.Now.AddSeconds(i),
D = i,
E = "hello",
F = i * 2
});
}
RunTest(foos, "Vanilla");
Hyper.ComponentModel.HyperTypeDescriptionProvider.Add(
typeof(MyData));
RunTest(foos, "Hyper");
Console.ReadLine(); // return to exit
}
}