2009-06-23 4 views
12

में बेनामी प्रकार की एक सूची बनाना:मैं, एक गुमनाम प्रकार की एक सूची बनाने के लिए उदाहरण के लिए करना चाहते हैं वीबी

Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _ 
         .StartDate = myFile(index).Day, 
         .EndDate = myFile(index).Day} 

मुझे लगता है कि गुमनाम प्रकार बनाया है। अब मैं इसे उस प्रकार की सूची में जोड़ना चाहता हूं। मैं उस प्रकार की एक सूची कैसे घोषित करूं?

उत्तर

12

यहां एक अनाम प्रकार से किसी अज्ञात प्रकार की सूची बनाने के लिए एक आसान तरीका है।

Public Function CreateListFromSingle(Of T)(ByVal p1 As T) As List(Of T) 
    Dim list As New List(Of T) 
    list.Add(p1) 
    return List 
End Function 

अब आप निम्नलिखित

Dim list = CreateListFromSingle(dsResource) 

संपादित ओपी एक तत्व बनाने से पहले सूची बनाने के लिए एक तरह से करना चाहता था कर सकते हैं।

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

Public Function CreateEmptyList(Of T)(ByVal unused As T) As List(Of T) 
    Return New List(Of T)() 
    End Function 

    Dim x = CreateEmptyList(New With { .Name = String.Empty, .ID = 42 }) 
+0

वहाँ उस प्रकार के एक भी करने के लिए मान निर्दिष्ट से पहले गुमनाम प्रकार प्रोटोटाइप करने के लिए कोई तरीका है में गुमनाम प्रकार जोड़ सकते हैं? मैं उन सामग्रियों के माध्यम से पुन: स्थापित करने से पहले उस प्रकार की एक सूची बनाना चाहता हूं जिसे मैं इसमें जोड़ना चाहता हूं। – Daniel

+1

हां, हमेशा चीजों को करने का एक तरीका है। लेकिन आप इसे पसंद नहीं करेंगे। क्योंकि इसे प्रतिबिंब कहा जाता है। – AgentFire

+0

@ जेरेडपायर, क्या आप मुझे बता सकते हैं कि मैंने क्या गलत किया है?मुझे त्रुटि मिलती है ** टाइप 'टी' परिभाषित नहीं किया गया है। ** स्क्रीनशॉट मैंने इसे कैसे करने की कोशिश की [यहां] (http://i.imgur.com/XjtN5HV.png)। – jp2code

6

चूंकि प्रकार अज्ञात है, तो आपको जेनेरिक और टाइप-इनफरेंस का उपयोग करना होगा।

सबसे अच्छा तरीका एक सामान्य कार्य को प्रस्तुत करना है जो प्रोटोटाइप ऑब्जेक्ट से खाली संग्रह बनाता है।

Module Module1 

    Sub Main() 
     Dim dsResource = New With {.Name = "Foo"} 

     Dim List = dsResource.CreateTypedList 
    End Sub 

    <System.Runtime.CompilerServices.Extension()> _ 
    Function CreateTypedList(Of T)(ByVal Prototype As T) As List(Of T) 
     Return New List(Of T)() 
    End Function 

End Module 
+0

आप सूची में प्रोटोटाइप तत्व जोड़ना भूल गए ... ;-) –

+1

मैंने नहीं किया ;-) इसका उपयोग एक नई सूची बनाने के लिए किया जाना चाहिए। प्रोटोटाइप ऑब्जेक्ट को इसकी सामग्री के बजाए इसकी संरचना के बारे में जानकारी देने की आवश्यकता है। – Dario

2

मैं जारेड का समाधान चाहते हैं, लेकिन बस (वहाँ मेरी टिप्पणी के होते हुए भी) जॉन की कोड के प्रत्यक्ष बराबर दिखाने के लिए:

Public Function EnumerateFromSingle(Of T)(ByVal p1 As T) As IEnumerable(Of T) 
    Return New T() { p1 } 
End Function 
नहीं

अपने आप में बहुत ही उपयोगी है, यह एक्स्टेंसिबल नहीं है के बाद से ... लेकिन इस्तेमाल किया जा सकता बड़ी सूचियां बनाने के लिए अन्य LINQ जादू को बीज दें।

7

यहाँ कैसे इनलाइन उदाहरण के द्वारा कास्टिंग का उपयोग कर यह करने के लिए है (एक दूसरे समारोह बनाने के बिना):

Sub Main() 
    Dim x = New With {.Name = "Bob", .Number = 8675309} 
    Dim xList = {x}.ToList() 
End Sub 

(C# संस्करण के आधार पर तैनात here)

अनिवार्य रूप से आप गुमनाम प्रकार बनाने के लिए, डाल यह एक सरणी ({x}) में है, फिर सूची प्राप्त करने के लिए सरणी की .ToList() विधि का उपयोग करें।

0

यदि आप पुनरावृत्ति द्वारा सूची में मूल्य जोड़ रहे हैं, तो मुझे लगता है कि आपके पास IEnumerable से शुरू करने के लिए है? .ToList के साथ बस .Select का उपयोग करें। यही वह है जिसे इसके लिए बनाया गया है।

Dim l = dsResources.Select(Function(d) New With { 
           .Name = d.Last_Name & ", " & d.First_Name 
          }).ToList() 
6

इस तरह की एक पंक्ति के बारे में कैसे?

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList 
1

एक पंक्ति में आप एक सूची

Dim aList = {(New With {.Name="John", .Age=30}),(.Name="Julie", .Age=32)}.ToList 
संबंधित मुद्दे