2014-05-19 13 views
19

मेरे पास डेटाटेबल है।डेटाटेबल से एक कॉलम मानों की सूची कैसे प्राप्त करें?

DataTable dt = new DataTable(); 

dt.Columns.Add(new DataColumn("id", Type.GetType("System.Int32"))); 
dt.Columns.Add(new DataColumn("name", Type.GetType("System.String"))); 
// more columns here 

मुझे "आईडी" मानों की सूची चाहिए।

मैं Linq बिना मेरे DataTable और में सभी पंक्तियों पर पाश बिना यह कर सकता हूँ?

संपादित करें:

सर्गेई के साथ छोटे चर्चा के बाद मैं वैसे भी पाश का उपयोग करने का फैसला किया। यह row[index] बजाय row[columnName] उपयोग करना बेहतर है दक्षता के लिए Linq

बिना
List<int> ids = new List<int>(dt.Rows.Count); 
foreach(DataRow row in dt.Rows) 
    ids.Add((int)row["id"]); 

नोट:

उत्तर

41

आप DataTable करने के लिए LINQ का उपयोग कर सकते हैं:

var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList(); 

अद्यतन। सबसे पहले कॉलम सरणी से इंडेक्स द्वारा कॉलम प्राप्त होता है। लेटर को आंतरिक शब्दकोश से कॉलम इंडेक्स मिलता है जो इंडेक्स के नामों को मानचित्र करता है, और उसके बाद केवल इंडेक्स द्वारा कॉलम प्राप्त होता है।

पंक्तियों की गिनती के साथ सूची की क्षमता शुरू करना एक और बात है। यदि आप ऐसा नहीं करेंगे, तो सूची की आंतरिक सरणी फिर से बनाई जाएगी और कई बार कॉपी की जाएगी (पंक्तियों की गणना पर निर्भर करता है)।

और आखिरी बात कहने के लिए - विशाल तालिका (यदि संभव हो) के साथ सबसे प्रभावी तरीका सर्वर पक्ष पर डेटा फ़िल्टर कर रहा है।

+1

@TimSchmelter एक्सटेंशन विधियों सी # 2 के साथ? :) –

+0

सबसे पहले लिंक के साथ है, दूसरा लूप के साथ है। यही वह है जिसे मैं टालना चाहता हूं। – Kamil

+0

@ किमिल मैं शर्त लगाता हूं कि मूल रूप से कोई लूप प्रतिबंध नहीं था। क्या आप व्याख्या कर सकते हैं कि लूप के साथ क्या गलत है? –

संबंधित मुद्दे