सबसे अच्छा तरीका है आईरिस या IEnumerable को ऐरे में कनवर्ट करना


99

मेरे पास एक HQL क्वेरी है जो या तो परिणामों का IList उत्पन्न कर सकती है, या परिणामों का IEnumerable।

हालाँकि, मैं यह चाहता हूं कि मैं जिस एंटिटी का चयन कर रहा हूं, उसका एक एरेना लौटाऊं, जो उसे पूरा करने का सबसे अच्छा तरीका होगा? मैं या तो इसके माध्यम से गणना कर सकता हूं और सरणी का निर्माण कर सकता हूं, या एक परिभाषित सरणी CopyTo () का उपयोग कर सकता हूं।

क्या कोई बेहतर तरीका है? मैं कॉपीटू-अप्रोच के साथ गया।


4
क्या किसी के पास लिनक के बिना कोई समाधान है ?
Bitterblue

जवाबों:


167

.NET का कौन सा संस्करण उपयोग कर रहे हैं? यदि यह .NET 3.5 है, तो मैं अभी कॉल करता हूं ToArray()और इसके साथ किया जाता हूं ।

यदि आपके पास केवल गैर-जेनेरिक IEnumerable है, तो कुछ इस तरह से करें:

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

यदि आप उस पद्धति के प्रकार को नहीं जानते हैं, लेकिन विधि के कॉलर इसे जानते हैं, तो विधि को सामान्य बनाएं और यह प्रयास करें:

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}

यह 3.5 है, लेकिन IQuery के पास एक ToArray नहीं है, और न ही IEnumerable या IList जहां तक ​​मैं बता सकता हूं?
जिवि

2
नहीं - वहाँ सिर्फ एक विस्तार विधि है। (यह स्वयं इंटरफ़ेस के भीतर नहीं है।)
जॉन स्कीट

3
@ शमी: हाँ वहाँ है ... किसी भी चीज़ से अलग, यह कंपाइलर को बता रहा है कि किस तरह की सरणी की उम्मीद है! यदि आप केवल एक object[]उचित उपयोग चाहते हैं Cast<object>। नॉनजेनिक के IEnumerableपास कोई ToArrayएक्सटेंशन विधि नहीं है , इसलिए आप सिर्फ कॉल foo.ToArray<object>या ऐसा कुछ भी नहीं कर सकते हैं ।
जॉन स्कीट

22
ToArrayविस्तार विधि में है System.Linqनाम स्थान, सोचा था कि पता करने के लिए :) अच्छा हो सकता है।
टॉमस जानसन 8

1
@Alexander: नहीं जब तक कि वास्तव में वापस किया जा रहा मूल्य एक उपयुक्त सरणी है।
जॉन स्कीट

47

अपनी .cs फ़ाइल में निम्नलिखित डालें:

using System.Linq;

आप तब System.Linq.Enumerable से निम्न एक्सटेंशन विधि का उपयोग करने में सक्षम होंगे:

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

अर्थात

IEnumerable<object> query = ...;
object[] bob = query.ToArray();

आह ... इकाई परीक्षण परियोजना में डिफ़ॉल्ट रूप से लाइनक शामिल नहीं है। धन्यवाद!
zsf222

6

मुझे लगता है कि पहिया को फिर से मजबूत करना ...

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}

क्या आप अपने उत्तर की व्याख्या कर सकते हैं और यह भी कि आप क्या मतलब है जैसे आप महसूस करते हैं कि आप पहिया को फिर से मजबूत कर रहे हैं?
क्रिसकैंप 20

हेह - मैं वास्तव में इस तरह की तरह: बंद मौका में वास्तव में एक सरणी है, आप ToArray()कॉल (आंतरिक Bufferवर्ग के माध्यम से ) में कदमों के लिए नए आवंटन / कॉपी छोड़ रहे हैं ... हालांकि अगर किसी को "मानक की उम्मीद है "व्यवहार की प्रतिलिपि बनाएँ, वे काफी आश्चर्यचकित होंगे।
जेरकीबॉल

@ क्रिस: क्योंकि मैं सिस्टमलीन में ToArray () विधि के हस्ताक्षर से प्रेरित था। msdn.microsoft.com/en-us/library/bb298736.aspx
Philippe Matray

अतिरिक्त हास्यास्पदता के लिए इस पद्धति के कार्यान्वयन को कॉल करना चाहिएIEnumerable.ToArray()
मफिन मैन

2

यदि आपके पास Linq नहीं है, तो मैंने इसे निम्न तरीके से हल किया:

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }

आशा करता हूँ की ये काम करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.