मैं ऑर्डर किए गए एरे पर ऑब्जेक्ट्स निर्देशों के लिए LINQ का उपयोग करता हूं। मुझे यह सुनिश्चित नहीं करना चाहिए कि सरणी का क्रम बदला नहीं गया है, मुझे कौन से संचालन करना चाहिए?
मैं ऑर्डर किए गए एरे पर ऑब्जेक्ट्स निर्देशों के लिए LINQ का उपयोग करता हूं। मुझे यह सुनिश्चित नहीं करना चाहिए कि सरणी का क्रम बदला नहीं गया है, मुझे कौन से संचालन करना चाहिए?
जवाबों:
मैंने System.Linq.Enumerable के तरीकों की जांच की , जो गैर-IEnumerable परिणाम लौटाता है। मैंने यह निर्धारित करने के लिए प्रत्येक की टिप्पणियों की जांच की कि परिणाम का क्रम स्रोत के आदेश से कैसे भिन्न होगा।
आदेश को पूरी तरह से संरक्षित करता है। आप किसी स्रोत तत्व को अनुक्रमणिका द्वारा परिणाम तत्व में मैप कर सकते हैं
आदेश सुरक्षित रखता है। तत्वों को फ़िल्टर या जोड़ा जाता है, लेकिन फिर से आदेश नहीं दिया जाता है।
आदेश को नष्ट कर देता है - हम नहीं जानते कि किस क्रम में परिणाम की उम्मीद करनी चाहिए।
Redefines ऑर्डर स्पष्ट रूप से - परिणाम के क्रम को बदलने के लिए इनका उपयोग करें
कुछ नियमों के अनुसार आदेश को फिर से परिभाषित करें।
संपादित करें: मैंने इस कार्यान्वयन के आधार पर डिस्टिंक्ट को संरक्षित करने के आदेश में स्थानांतरित कर दिया है ।
private static IEnumerable<TSource> DistinctIterator<TSource>
(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}
Distinct
विधि के लिए) का अर्थ केवल "अनसोल्ड" हो, न कि "अप्रत्याशित क्रम में"। मैं कहता हूं कि Distinct
ऊपर की तरह फ़िल्टरिंग श्रेणी से संबंधित है Where
।
क्या आप वास्तव में SQL के बारे में, या सरणियों के बारे में बात कर रहे हैं? इसे दूसरे तरीके से रखने के लिए, क्या आप LINQ को SQL या LINQ को ऑब्जेक्ट्स में उपयोग कर रहे हैं?
ऑब्जेक्ट ऑपरेटर्स को LINQ वास्तव में उनके मूल डेटा स्रोत को परिवर्तित नहीं करता है - वे अनुक्रम बनाते हैं जो प्रभावी रूप से डेटा स्रोत द्वारा समर्थित होते हैं। ऑर्डरिंग को बदलने वाले एकमात्र ऑपरेशन ऑर्डरबाय / ऑर्डरबायस्केंडिंग / थेबी / तबबायस्केंडिंग - और फिर भी, समान रूप से ऑर्डर किए गए तत्वों के लिए स्थिर हैं। बेशक, कई ऑपरेशन कुछ तत्वों को फ़िल्टर करेंगे, लेकिन जो तत्व वापस आ जाएंगे, वे उसी क्रम में होंगे।
यदि आप एक अलग डेटा संरचना में कनवर्ट करते हैं, जैसे कि ToLookup या To मंदार के साथ, मेरा मानना है कि आदेश उस बिंदु पर संरक्षित नहीं है - लेकिन यह वैसे भी कुछ अलग है। (मानों का क्रम उसी कुंजी पर मैप करने का क्रम लुकअप के लिए संरक्षित है, हालांकि मेरा मानना है।)
GroupBy
इसके बाद SelectMany
परिणाम कुंजी द्वारा समूहीकृत होंगे, लेकिन आरोही कुंजी क्रम में नहीं ... यह उन्हें उस क्रम में देगा जिसमें कुंजी मूल रूप से हुई थी।
list<x> {a b c d e f g}
यदि c, d, e सभी में समान कुंजी है तो परिणामी अनुक्रम में c, d, e एक दूसरे के बगल में और आदेश c, d, e में होंगे। मुझे एक स्पष्ट MS- आधारित उत्तर नहीं मिल रहा है।
यदि आप किसी सरणी पर काम कर रहे हैं, तो ऐसा लगता है कि आप LINQ-to-Objects का उपयोग कर रहे हैं, SQL का नहीं; क्या आप पुष्टि कर सकते हैं? अधिकांश LINQ ऑपरेशंस किसी भी चीज़ को री-ऑर्डर नहीं करते हैं (आउटपुट इनपुट के समान ऑर्डर में होगा) - इसलिए किसी अन्य प्रकार (ऑर्डरबाय [अवरोही] / फिर तब तक लागू न करें] पर लागू न करें)।
[संपादित करें: जॉन ने और अधिक स्पष्ट रूप से कहा; LINQ आम तौर पर एक नया अनुक्रम बनाता है , जो मूल डेटा को अकेला छोड़ देता है]
ध्यान दें कि डेटा को एक Dictionary<,>
(To मंदार) में धकेलने से डेटा खराब हो जाएगा, क्योंकि शब्दकोश किसी विशेष प्रकार के आदेश का सम्मान नहीं करता है।
लेकिन ज्यादातर सामान्य चीजें (सेलेक्ट, व्हेयर, स्किप, टेक) ठीक होनी चाहिए।
ToDictionary()
केवल ऑर्डर के बारे में कोई वादा नहीं करता , लेकिन व्यवहार में इनपुट ऑर्डर बनाए रखता है (जब तक कि आप इसमें से कुछ नहीं निकालते)। मैं इस पर भरोसा करने के लिए नहीं कह रहा हूं, लेकिन 'हाथापाई' गलत है।
मुझे इसी तरह के प्रश्न में एक महान जवाब मिला जो आधिकारिक दस्तावेज का संदर्भ देता है। इसे उद्धृत करने के लिए:
के लिए Enumerable
तरीके (वस्तुओं को LINQ, पर लागू होता है जो List<T>
), आप द्वारा दिया तत्वों के आदेश पर भरोसा कर सकते हैं Select
, Where
या GroupBy
। यह उन चीज़ों के लिए नहीं है जो स्वाभाविक रूप से अनियंत्रित हैं जैसे ToDictionary
या Distinct
।
से Enumerable.GroupBy प्रलेखन:
प्रत्येक
IGrouping<TKey, TElement>
स्रोत की पहली कुंजी उत्पन्न करने वाले स्रोत में तत्वों के क्रम के आधार पर वस्तुओं का उत्पादन किया जाता हैIGrouping<TKey, TElement>
। एक समूहीकरण में तत्वों को उस क्रम में प्राप्त किया जाता है जिस क्रम में वे दिखाई देते हैंsource
।
यह जरूरी नहीं कि IQueryable
विस्तार के तरीकों (अन्य LINQ प्रदाताओं) के लिए सही हो।
स्रोत: LINQ के अनगिनत तरीके तत्वों के सापेक्ष क्रम को बनाए रखते हैं?
यहाँ प्रश्न विशेष रूप से LINQ-to-Objects का जिक्र कर रहा है।
यदि आपके बजाय LINQ-to-SQL का उपयोग कर रहा है तो वहां कोई आदेश नहीं है जब तक कि आप एक को कुछ के साथ नहीं लगाते हैं:
mysqlresult.OrderBy(e=>e.SomeColumn)
यदि आप LINQ-to-SQL के साथ ऐसा नहीं करते हैं, तो परिणाम का क्रम बाद के प्रश्नों के बीच भिन्न हो सकता है, यहां तक कि समान डेटा के कारण, जो आंतरायिक बग पैदा कर सकता है।