आप .. (सरल व्यक्ति अपने Age
द्वारा हल कर रहे हैं,) सुंदर कैसे समझ में इस तरह की उथल काम करता है के करीब हैं अपने दूसरे मामले में
pupils.OrderBy(x => x.Age);
Comparer<int>.Default
प्रयोग किया जाता है।
अपने पहले मामले में, Comparer<Guid>.Default
प्रयोग किया जाता है।
अब यह कैसे काम करता है?।
हर बार जब आप Guid.NewGuid()
(संभवतः) एक अलग/मूल/गैर डुप्लिकेट Guid
उत्पादित करते हैं।अब जब आप
var randomNumbers = Enumerable.Range(0, 100).OrderBy(x => Guid.NewGuid());
संख्याएं उत्पन्न ग्रिड के आधार पर क्रमबद्ध की जाती हैं।
अब guids क्या हैं?
वे 128 बिट पूर्णांक हेक्साडेसिमल रूप में दर्शाए जाते हैं। चूंकि 2^128 इतनी बड़ी संख्या है कि दो गिड्स उत्पन्न करने की संभावना बहुत दुर्लभ/लगभग असंभव है। चूंकि गइड्स कुछ प्रकार की यादृच्छिकता प्रदर्शित करते हैं, इसलिए आदेश भी यादृच्छिक होगा।
आदेश देने के लिए दो गुड्स कैसे तुलना किए जाते हैं?
आप इसे एक छोटे प्रयोग के आधार पर पुष्टि कर सकते हैं। कार्य करें:
var guids = Enumerable.Range(0, 10).Select((x, i) =>
{
Guid guid = Guid.NewGuid();
return new { Guid = guid, NumberRepresentation = new BigInteger(guid.ToByteArray()), OriginalIndex = i };
}).ToArray();
var guidsOrderedByTheirNumberRepresentation = guids.OrderBy(x => x.NumberRepresentation).ToArray();
var guidsOrderedAsString = guids.OrderBy(x => x.Guid.ToString()).ToArray();
var randomNumbers = Enumerable.Range(0, 10).OrderBy(x => guids[x].Guid).ToArray();
//print randomNumbers.SequenceEqual(guidsOrderedByTheirNumberRepresentation.Select(x => x.OriginalIndex)) => false
//print randomNumbers.SequenceEqual(guidsOrderedAsString.Select(x => x.OriginalIndex)) => true
तो Comparer<Guid>.Default
GUID की स्ट्रिंग प्रतिनिधित्व पर आधारित है।
एक तरफ
:
Fisher-Yates गति के लिए फेरबदल
आप का उपयोग करना चाहिए। हो सकता है
public static IEnumerable<T> Shuffle<T>(this IList<T> lst)
{
Random rnd = new Random();
for (int i = lst.Count - 1; i >= 0; i--)
{
int j = rnd.Next(i + 1);
yield return lst[j];
lst[j] = lst[i];
}
}
या संक्षिप्तता के लिए, बस (जो अभी भी Guid दृष्टिकोण की तुलना में तेजी हो सकता है)
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> lst)
{
Random rnd = new Random();
return lst.OrderBy(x => rnd.Next());
}
मैं यहां आपके प्रश्न को समझ नहीं पा रहा हूं। आपके उपर्युक्त उदाहरण में, आयु मानना एक int है, 'क्वेरी' में आदेशित सूची होगी। तो, आपकी प्रारंभिक सरणी को सॉर्ट या शफल नहीं किया गया है। – ryadavilli
मैंने पोस्ट अपडेट किया। मैं पहले कोड नमूने के बारे में बात कर रहा हूँ। –
फिशर-येट्स को वास्तविक कोड में शफल करने का प्रयास करें .. तेज .. – nawfal