दिलचस्प पोस्ट
मैं एक कैरेक्टर का यूनिकोड कोड बिंदु कैसे प्राप्त करूं? अगर / और फ़ंक्शन के अंदर और बाहर का निर्माण होता है यूनिकोड और यूटीएफ -8 में क्या अंतर है? Django South – तालिका पहले से ही मौजूद है .NET 4.0 Windows XP SP2 या नीचे के साथ संगत है? सतह दृश्य और दृश्य के बीच का अंतर? Django m2m फॉर्म को "के माध्यम से" तालिका को बचाएं मॉलोक () और मॉलोकैंकोलिकेट () में सेगफाल्ट्स द्विआधारी कोड में एक स्ट्रिंग कैसे छिपाएगी? अजगर पांडा: एक श्रृंखला के लिए तर्क के साथ एक फ़ंक्शन लागू करें जावास्क्रिप्ट के माध्यम से फार्म का कैसे सेट करें? Socket.io से कच्चे वेबकॉट्स पर चल रहा है? गिट में लेखक और कॉमटर नाम और कई कमानों के ई-मेल को बदलें JQuery में वंशज तत्वों का चयन करने के लिए सबसे तेज़ तरीका क्या है? Python शब्दकोश धागा सुरक्षित है?

जेनेरिक सूची / डेटाटाले के लिए एन्यूमेरेबल कन्वर्ट?

मेरे पास कुछ तरीके हैं जो विभिन्न जेनेरिक सूचियों को रिटर्न देते हैं

किसी भी वर्ग स्थिर विधि या किसी भी सूची को किसी आंकड़े में कनवर्ट करने के लिए किसी भी वर्तमान में मौजूद है? ऐसा करने के लिए केवल एक चीज है जिसे मैं कल्पना कर सकता हूं प्रतिबिंब का उपयोग कर रहा हूं।

यदि मेरे पास यह है:

List<Whatever> whatever = new List<Whatever>(); 

(यह अगला कोड निश्चित रूप से काम नहीं करता है, लेकिन मैं इसकी संभावना चाहूंगा:

 DataTable dt = (DataTable) whatever; 

Solutions Collecting From Web of "जेनेरिक सूची / डेटाटाले के लिए एन्यूमेरेबल कन्वर्ट?"

NuGet से FastMember का उपयोग करते हुए यहां एक अच्छा 2013 अपडेट है:

 IEnumerable<SomeType> data = ... DataTable table = new DataTable(); using(var reader = ObjectReader.Create(data)) { table.Load(reader); } 

यह अधिकतम प्रदर्शन के लिए FastMember की मेटा-प्रोग्रामिंग एपीआई का उपयोग करता है। यदि आप इसे विशेष सदस्यों को प्रतिबंधित करना चाहते हैं (या आदेश लागू करें), तो आप ऐसा भी कर सकते हैं:

 IEnumerable<SomeType> data = ... DataTable table = new DataTable(); using(var reader = ObjectReader.Create(data, "Id", "Name", "Description")) { table.Load(reader); } 

संपादक का दावा / दावेदार: फास्टएमम्बर एक मार्क ग्रेवेल परियोजना है। इसका सोना और फुल-ऑन फ्लाई!


हाँ, यह इस एक के बिल्कुल सटीक विपरीत है; प्रतिबिंब पर्याप्त होगा – या यदि आपको जल्दी, HyperDescriptor 2.0 में, या 3.5 में Expression आवश्यकता होगी। दरअसल, 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; } 

अब एक पंक्ति के साथ आप प्रतिबिंब से अधिक कई गुना तेज कर सकते हैं (ऑब्जेक्ट-प्रकार T लिए HyperDescriptor सक्षम HyperDescriptor )


संपादन कार्यप्रदर्शन क्वेरी; यहां परिणाम के साथ एक परीक्षण रिग है:

 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 } } 

मुझे मार्क ग्रेवेल का नमूना कोड संशोधित करना था, जो कि संकीर्ण प्रकार और शून्य मूल्यों को संभाल सके। मैंने नीचे एक कार्यशील संस्करण शामिल किया है I धन्यवाद मार्क

 public static DataTable ToDataTable<T>(this IList<T> data) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); foreach (PropertyDescriptor prop in properties) table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); foreach (T item in data) { DataRow row = table.NewRow(); foreach (PropertyDescriptor prop in properties) row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; table.Rows.Add(row); } return table; } 

यह समाधान का एक सरल मिश्रण है यह Nullable प्रकार के साथ काम करते हैं

 public static DataTable ToDataTable<T>(this IList<T> list) { 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, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } object[] values = new object[props.Count]; foreach (T item in list) { for (int i = 0; i < values.Length; i++) values[i] = props[i].GetValue(item) ?? DBNull.Value; table.Rows.Add(values); } return table; } 

मार्क के जवाब में एक छोटा परिवर्तन यह मान प्रकारों के साथ काम करने के लिए करता है जैसे डेटा तालिका के लिए List<string> :

 public static DataTable ListToDataTable<T>(IList<T> data) { DataTable table = new DataTable(); //special handling for value types and string if (typeof(T).IsValueType || typeof(T).Equals(typeof(string))) { DataColumn dc = new DataColumn("Value"); table.Columns.Add(dc); foreach (T item in data) { DataRow dr = table.NewRow(); dr[0] = item; table.Rows.Add(dr); } } else { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); foreach (PropertyDescriptor prop in properties) { table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } foreach (T item in data) { DataRow row = table.NewRow(); foreach (PropertyDescriptor prop in properties) { try { row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; } catch (Exception ex) { row[prop.Name] = DBNull.Value; } } table.Rows.Add(row); } } return table; } 

यह XmlSerialization के माध्यम से भी संभव है यह विचार है – XML ​​को सीरियलाइज़ करें और फिर DataSet की readXml विधि

मैं इस कोड का उपयोग करता हूं (उत्तर में से, भूल गया जहां)

  public static string SerializeXml<T>(T value) where T : class { if (value == null) { return null; } XmlSerializer serializer = new XmlSerializer(typeof(T)); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = new UnicodeEncoding(false, false); settings.Indent = false; settings.OmitXmlDeclaration = false; // no BOM in a .NET string using (StringWriter textWriter = new StringWriter()) { using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) { serializer.Serialize(xmlWriter, value); } return textWriter.ToString(); } } 

तो फिर यह उतना आसान है जैसे:

  string xmlString = Utility.SerializeXml(trans.InnerList); DataSet ds = new DataSet("New_DataSet"); using (XmlReader reader = XmlReader.Create(new StringReader(xmlString))) { ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture; ds.ReadXml(reader); } 

यह निश्चित नहीं है कि यह इस पोस्ट के अन्य सभी उत्तरों के खिलाफ कैसे है, लेकिन यह एक संभावना भी है

एमएसडीएन पर यह लिंक एक यात्रा के लायक है: कैसे करें: कॉपीटोडाटाटेबल <T> को लागू करें जहां सामान्य प्रकार टी डेटार नहीं है

यह एक्सटेंशन एक्सटेंशन जोड़ता है जो आपको ऐसा करने देता है:

 // Create a sequence. Item[] items = new Item[] { new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"}, new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"}, new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"}, new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}}; // Query for items with price greater than 9.99. var query = from i in items where i.Price > 9.99 orderby i.Price select i; // Load the query results into new DataTable. DataTable table = query.CopyToDataTable(); 

मैंने इस कार्य को पूरा करने के लिए एक छोटी लाइब्रेरी लिखी है। यह केवल पहली बार प्रतिबिंब का उपयोग करता है, जब किसी ऑब्जेक्ट प्रकार को डेटाैट में अनुवाद किया जाता है। यह एक ऐसी विधि का उत्सर्जन करता है जो एक ऑब्जेक्ट प्रकार का अनुवाद करने वाले सभी काम करेगा।

इसकी तीव्रता बढ़ रही है आप इसे यहां पा सकते हैं: Google Code पर ModelShredder

 public DataTable ConvertToDataTable<T>(IList<T> data) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); foreach (PropertyDescriptor prop in properties) table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); foreach (T item in data) { DataRow row = table.NewRow(); foreach (PropertyDescriptor prop in properties) row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; table.Rows.Add(row); } return table; } 

इसे इस्तेमाल करे

 public static DataTable ListToDataTable<T>(IList<T> lst) { currentDT = CreateTable<T>(); Type entType = typeof(T); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); foreach (T item in lst) { DataRow row = currentDT.NewRow(); foreach (PropertyDescriptor prop in properties) { if (prop.PropertyType == typeof(Nullable<decimal>) || prop.PropertyType == typeof(Nullable<int>) || prop.PropertyType == typeof(Nullable<Int64>)) { if (prop.GetValue(item) == null) row[prop.Name] = 0; else row[prop.Name] = prop.GetValue(item); } else row[prop.Name] = prop.GetValue(item); } currentDT.Rows.Add(row); } return currentDT; } public static DataTable CreateTable<T>() { Type entType = typeof(T); DataTable tbl = new DataTable(DTName); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); foreach (PropertyDescriptor prop in properties) { if (prop.PropertyType == typeof(Nullable<decimal>)) tbl.Columns.Add(prop.Name, typeof(decimal)); else if (prop.PropertyType == typeof(Nullable<int>)) tbl.Columns.Add(prop.Name, typeof(int)); else if (prop.PropertyType == typeof(Nullable<Int64>)) tbl.Columns.Add(prop.Name, typeof(Int64)); else tbl.Columns.Add(prop.Name, prop.PropertyType); } return tbl; } 

मार्क ग्रेवेल का जवाब है लेकिन वीबी। नेट में

 Public Shared Function ToDataTable(Of T)(data As IList(Of T)) As DataTable Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(GetType(T)) Dim table As New DataTable() For i As Integer = 0 To props.Count - 1 Dim prop As PropertyDescriptor = props(i) table.Columns.Add(prop.Name, prop.PropertyType) Next Dim values As Object() = New Object(props.Count - 1) {} For Each item As T In data For i As Integer = 0 To values.Length - 1 values(i) = props(i).GetValue(item) Next table.Rows.Add(values) Next Return table End Function 

मुझे वैकल्पिक समाधान के साथ भी आना था, क्योंकि यहां सूचीबद्ध विकल्पों में से कोई भी मेरे मामले में काम नहीं करता था। मैं एक IEnumerable का उपयोग कर रहा था जो एक IEnumerable लौटा और गुणों को एन्यूमरेट नहीं किया जा सका। यह चाल किया था:

 // remove "this" if not on C# 3.0 / .NET 3.5 public static DataTable ConvertToDataTable<T>(this IEnumerable<T> data) { List<IDataRecord> list = data.Cast<IDataRecord>().ToList(); PropertyDescriptorCollection props = null; DataTable table = new DataTable(); if (list != null && list.Count > 0) { props = TypeDescriptor.GetProperties(list[0]); for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); } } if (props != null) { 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) ?? DBNull.Value; } table.Rows.Add(values); } } return table; } 
  using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.ComponentModel; public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt = lstEmployee.ConvertToDataTable(); } public static DataTable ConvertToDataTable<T>(IList<T> list) where T : class { try { DataTable table = CreateDataTable<T>(); Type objType = typeof(T); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(objType); foreach (T item in list) { DataRow row = table.NewRow(); foreach (PropertyDescriptor property in properties) { if (!CanUseType(property.PropertyType)) continue; row[property.Name] = property.GetValue(item) ?? DBNull.Value; } table.Rows.Add(row); } return table; } catch (DataException ex) { return null; } catch (Exception ex) { return null; } } private static DataTable CreateDataTable<T>() where T : class { Type objType = typeof(T); DataTable table = new DataTable(objType.Name); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(objType); foreach (PropertyDescriptor property in properties) { Type propertyType = property.PropertyType; if (!CanUseType(propertyType)) continue; //nullables must use underlying types if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) propertyType = Nullable.GetUnderlyingType(propertyType); //enums also need special treatment if (propertyType.IsEnum) propertyType = Enum.GetUnderlyingType(propertyType); table.Columns.Add(property.Name, propertyType); } return table; } private static bool CanUseType(Type propertyType) { //only strings and value types if (propertyType.IsArray) return false; if (!propertyType.IsValueType && propertyType != typeof(string)) return false; return true; } } 

मुझे पता है कि यह थोड़ी देर के लिए बंद कर दिया गया है; हालांकि, मुझे इस विशिष्ट समस्या का हल था, लेकिन थोड़ी सी मोड़ की जरूरत थी: कॉलम और डेटा तालिका को पूर्वनिर्धारित / पहले से ही तत्काल किया जाना चाहिए। तब मुझे बस डेटा तालिका में प्रकार डालने की आवश्यकता थी।

तो यहाँ मैं क्या किया है की एक उदाहरण है:

 public static class Test { public static void Main() { var dataTable = new System.Data.DataTable(Guid.NewGuid().ToString()); var columnCode = new DataColumn("Code"); var columnLength = new DataColumn("Length"); var columnProduct = new DataColumn("Product"); dataTable.Columns.AddRange(new DataColumn[] { columnCode, columnLength, columnProduct }); var item = new List<SomeClass>(); item.Select(data => new { data.Id, data.Name, data.SomeValue }).AddToDataTable(dataTable); } } static class Extensions { public static void AddToDataTable<T>(this IEnumerable<T> enumerable, System.Data.DataTable table) { if (enumerable.FirstOrDefault() == null) { table.Rows.Add(new[] {string.Empty}); return; } var properties = enumerable.FirstOrDefault().GetType().GetProperties(); foreach (var item in enumerable) { var row = table.NewRow(); foreach (var property in properties) { row[property.Name] = item.GetType().InvokeMember(property.Name, BindingFlags.GetProperty, null, item, null); } table.Rows.Add(row); } } } 

Datatable को सूची कन्वर्ट करने के लिए यह सरल कंसोल अनुप्रयोग है।

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.ComponentModel; namespace ConvertListToDataTable { public static class Program { public static void Main(string[] args) { List<MyObject> list = new List<MyObject>(); for (int i = 0; i < 5; i++) { list.Add(new MyObject { Sno = i, Name = i.ToString() + "-KarthiK", Dat = DateTime.Now.AddSeconds(i) }); } DataTable dt = ConvertListToDataTable(list); foreach (DataRow row in dt.Rows) { Console.WriteLine(); for (int x = 0; x < dt.Columns.Count; x++) { Console.Write(row[x].ToString() + " "); } } Console.ReadLine(); } public class MyObject { public int Sno { get; set; } public string Name { get; set; } public DateTime Dat { get; set; } } public static DataTable ConvertListToDataTable<T>(this List<T> iList) { DataTable dataTable = new DataTable(); PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); for (int i = 0; i < props.Count; i++) { PropertyDescriptor propertyDescriptor = props[i]; Type type = propertyDescriptor.PropertyType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) type = Nullable.GetUnderlyingType(type); dataTable.Columns.Add(propertyDescriptor.Name, type); } object[] values = new object[props.Count]; foreach (T iListItem in iList) { for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(iListItem); } dataTable.Rows.Add(values); } return dataTable; } } } 

आप सभी के लिए एक कैरियर के लिए इंतजार कर रहे हैं।

 // remove "this" if not on C# 3.0 / .NET 3.5 public static DataTable ToDataTable<T>(IList<T> data) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); Type Propiedad = null; for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; Propiedad = prop.PropertyType; if (Propiedad.IsGenericType && Propiedad.GetGenericTypeDefinition() == typeof(Nullable<>)) { Propiedad = Nullable.GetUnderlyingType(Propiedad); } table.Columns.Add(prop.Name, Propiedad); } 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; } 
  Dim counties As New List(Of County) Dim dtCounties As DataTable dtCounties = _combinedRefRepository.Get_Counties() If dtCounties.Rows.Count <> 0 Then For Each row As DataRow In dtCounties.Rows Dim county As New County county.CountyId = row.Item(0).ToString() county.CountyName = row.Item(1).ToString().ToUpper() counties.Add(county) Next dtCounties.Dispose() End If 

एक अन्य दृष्टिकोण ऊपर है:

  List<WhateEver> lst = getdata(); string json = Newtonsoft.Json.JsonConvert.SerializeObject(lst); DataTable pDt = JsonConvert.DeserializeObject<DataTable>(json);