इस कोड को निम्नलिखित उत्पादन मेंकहां बनाम foreach के साथ - क्यों अलग परिणाम?
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication
{
internal class Program
{
public static void Main()
{
var values = new[] {1, 2, 3, 3, 2, 1, 4};
var distinctValues = GetDistinctValuesUsingWhere(values);
Console.WriteLine("GetDistinctValuesUsingWhere No1: " + string.Join(",", distinctValues));
Console.WriteLine("GetDistinctValuesUsingWhere No2: " + string.Join(",", distinctValues));
distinctValues = GetDistinctValuesUsingForEach(values);
Console.WriteLine("GetDistinctValuesUsingForEach No1: " + string.Join(",", distinctValues));
Console.WriteLine("GetDistinctValuesUsingForEach No2: " + string.Join(",", distinctValues));
Console.ReadLine();
}
private static IEnumerable<T> GetDistinctValuesUsingWhere<T>(IEnumerable<T> items)
{
var set=new HashSet<T>();
return items.Where(i=> set.Add(i));
}
private static IEnumerable<T> GetDistinctValuesUsingForEach<T>(IEnumerable<T> items)
{
var set=new HashSet<T>();
foreach (var i in items)
{
if (set.Add(i))
yield return i;
}
}
}
}
परिणाम:
GetDistinctValuesUsingWhere नं .1: 1,2,3,4
GetDistinctValuesUsingWhere No2:
GetDistinctValuesUsingForEach नं .1: 1,2 , 3,4
GetDistinctValuesUsingForEac एच संख्या 2: 1,2,3,4
मुझे समझ में नहीं आता कि मुझे "GetDistinctValuesUsingWhere No2" पंक्ति में कोई मूल्य क्यों नहीं मिलता है।
क्या कोई मुझे यह समझा सकता है?
अद्यतन स्कॉट से जवाब के बाद, मैं निम्नलिखित करने के लिए उदाहरण बदल दिया है:
private static IEnumerable<T> GetDistinctValuesUsingWhere2<T>(IEnumerable<T> items)
{
var set = new HashSet<T>();
var capturedVariables = new CapturedVariables<T> {set = set};
foreach (var i in items)
if (capturedVariables.set.Add(i))
yield return i;
//return Where2(items, capturedVariables);
}
private static IEnumerable<T> Where2<T>(IEnumerable<T> source, CapturedVariables<T> variables)
{
foreach (var i in source)
if (variables.set.Add(i))
yield return i;
}
private class CapturedVariables<T>
{
public HashSet<T> set;
}
यह दो बार उत्पादन 1,2,3,4 का परिणाम देगा।
हालांकि, अगर मैं सिर्फ लाइन uncomment
वापसी Where2 (आइटम, capturedVariables);
और टिप्पणी लाइनों
foreach (मदों में वर i) अगर (capturedVariables.set.Add (i)) उपज वापसी मैं;
विधि में GetDistinctValuesUsingWhere2, मुझे केवल एक बार आउटपुट 1,2,3,4 मिलेगा। यह हटाए गए लाइनों की पूरी तरह से है और अब-असम्बद्ध विधि बिल्कुल वही हैं।
मैं अभी भी यह नहीं मिलता है ....
ऑफ-विषय, लेकिन क्यों न केवल 'अलग' (या गुणों के साथ वस्तुओं, MorelinQ की 'DistinctBy') का उपयोग क्यों करें? या यह सिर्फ एक सीखने का अभ्यास है? –
अपने कहां के अंत में '.TList() 'जोड़ने का प्रयास करें, आपको सही परिणाम मिलना चाहिए। समस्या यह है कि आप अभिव्यक्ति वापस कर रहे हैं, इसलिए जब भी आप ऑब्जेक्ट का अनुरोध करेंगे तो इसका पुनर्मूल्यांकन किया जाएगा। – Kolichikov
संभावित डुप्लिकेट: [कैसे बताएं कि एक आईनेमरेबल स्थगित निष्पादन के अधीन है?] (Https://stackoverflow.com/questions/1168944/how-to-tell-if-an-ienumerablet-is-subject-to- स्थगित-निष्पादन) –
Igor