2012-09-18 5 views
7

के साथ Tolist() LinqQuery.ToList() के बीच अंतर जानने में सक्षम नहीं हूं। अलग() और LinqQuery.Distinct()। ToList(); मेरे लिए दोनों एक जैसे दिखते हैं।क्यों। टॉलिस्ट()। विशिष्ट() त्रुटि फेंकता है लेकिन नहीं। डिस्टिंक()। लिनक्स()। Linq क्वेरी

List<string> stringList = new List<string>(); 

List<string> str1 = (from item in stringList 
           select item).ToList().Distinct(); 

List<string> str2 = (from item in stringList 
           select item).Distinct().ToList(); 

str1 के रूप में एक त्रुटि दिखाता है::

इस नमूना कोड पर विचार करें। "परोक्ष 'System.Collections.Generic.List' के लिए प्रकार 'System.Collections.Generic.IEnumerable' कनवर्ट नहीं कर सकता एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?) "

लेकिन str2 के लिए कोई त्रुटि नहीं है।

कृपया इन दोनों के बीच अंतर को समझने में मेरी सहायता करें। धन्यवाद

+2

"फेंकता है" (आमतौर पर एक अपवाद) एक त्रुटि जो रनटाइम के दौरान होता है वर्णन करने के लिए उपयोग की जाती है:

// note: this first example does not compile List<string> str1 = (from item in stringList select item) // result: IEnumerable<string> .ToList() // result: List<string> .Distinct(); // result: IEnumerable<string> List<string> str2 = (from item in stringList select item) // result: IEnumerable<string> .Distinct() // result: IEnumerable<string> .ToList(); // result: List<string> 

यह क्यों इतना है की उदाहरण के लिए, Distinct() के निम्नलिखित कच्चे कार्यान्वयन पर विचार करें। जबकि यह संकलन समय त्रुटि है। –

उत्तर

18

.Distinct() एक विधि है कि एक IEnumerable<T> पर चल रही है, और रिटर्न एक IEnumerable<T> (lazily का मूल्यांकन)। एक IEnumerable<T> एक अनुक्रम है: यह List<T> नहीं है। इसलिए, यदि आप किसी सूची के साथ समाप्त करना चाहते हैं, तो अंत में .ToList() डालें।

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source) { 
    var seen = new HashSet<T>(); 
    foreach(var value in source) { 
     if(seen.Add(value)) { // true == new value we haven't seen before 
      yield return value; 
     } 
    } 
} 
+0

str1 को काम करने के क्रम में, अंत में "ToList() जोड़ें। तो यह tihs जैसा दिखता है: xxx.ToList()। विशिष्ट()। ToList() – Marty

+2

@ मार्टी जो अवांछनीय होगा; यह एक अनावश्यक सूची बनाता है बीच में; मौजूदा 'str2' कोड बेहतर होगा। –

+0

धन्यवाद बहुत मार्क :) –

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