2010-02-05 11 views
6

मेरे पास निम्नलिखित विधि को अधिक सामान्य बनाने की कोशिश कर रहे एक मस्तिष्क फार्ट है कि columnValues पैरामीटर के लिए पास किया जा सकता है। यहाँ मैं क्या है:मैं इस विस्तार विधि को और अधिक सामान्य कैसे बना सकता हूं?

public static DataRow NewRow(this DataTable dataTable, List<string> columnValues) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.ToArray(); 
    return returnValue; 
} 

मैं इसे एक List<object> करने से पहले यह विधि को पारित करने के लिए बदल सकते हैं और मूल सूची में परिवर्तित कर सकते हैं, लेकिन मुझे यकीन है कि वहाँ एक बेहतर विकल्प :-)

संपादित है कर रहा हूँ :

फ्रैंक की पोस्ट ने मुझे इस पर पुनर्विचार किया। अधिकांश मामलों में स्रोत List<T>List<object> होगा क्योंकि कॉलम मान अधिकतर अलग-अलग प्रकार होंगे।

मेरे शुरुआती उपयोग के लिए List<string> समझ में आया क्योंकि मैं एक सीएसवी पार्स से एक डेटासेट बना रहा था जो उस बिंदु पर सभी पाठ है।

उत्तर

4

आप मूल रूप से भाग्य से बाहर हो क्योंकि DataRow की मद सरणी में ऑब्जेक्ट की श्रृंखला है सिलसिले में, है कि अंततः आप कर सकते हैं है, केवल वस्तुओं की सूची में पास करें।

यदि आप सूची का एक सामान्य पैरामीटर डालते हैं तो सूची के सभी आइटम उस प्रकार के होंगे, जो कि उपयोगी होने की संभावना नहीं है।

कहा करने के बाद आदेश कई कॉलम, विभिन्न प्रकार के साथ सभी प्राप्त करने के लिए, आप अपने विस्तार विधि बदल सकता है, एक वस्तु जिसमें आप एक गुमनाम प्रकार का दृष्टांत स्वीकार करने के लिए:

table.NewRow(new { A = "Hello", B = 1, C = DateTime.Now }) 

सहायता के साथ परिवर्तित करने के लिए अज्ञात प्रकार मान एक स्ट्रिंग के लिए, ऑब्जेक्ट डिक्शनरी या तो by reflection or by a dynamic method यह एक काफी उपयोगी बात होनी चाहिए।

+0

लॉल आप बिंदु उत्कृष्ट हैं और मैंने इसे नहीं माना था। मेरे शुरुआती उपयोग के लिए एक सूची समझ में आया क्योंकि मैं एक सीएसवी पार्स से एक डेटासेट बना रहा था जो उस बिंदु पर सभी पाठ है। अधिकांश अन्य उपयोगों के लिए यह समझ में नहीं आता है क्योंकि कॉलम मान अधिकतर अलग-अलग प्रकार होंगे। –

2

के बारे में क्या

IEnumerable<object> 

साथ

columnValues.Select(x => x.ToString()).ToArray(); 
5

क्यों नहीं बस का उपयोग params object[]:

public static DataRow NewRow(this DataTable dataTable, params object[] objects) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (objects.Length > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = objects; 
    return returnValue; 
} 

तो फिर तुम सिर्फ इस तरह यह कॉल कर सकते हैं:

myDataTable.NewRow(1,2,"hello"); 
1

क्या कैसे अपने इनपुट प्रकार

पर आधारित ItemArray उत्पन्न करने के लिए निर्दिष्ट करने के लिए एक बंद उपयोग के बारे में
public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria) 
{ 
    DataRow returnValue = dataTable.NewRow(); 

    while (columnValues.Count > returnValue.Table.Columns.Count) 
    { 
     returnValue.Table.Columns.Add(); 
    } 

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray(); 
    return returnValue; 
} 
संबंधित मुद्दे