यह मानते हुए कि यह एक बहुत ही बुनियादी कार्य है, मैं इसे करने का एक उचित तरीका नहीं सोच सकता था। आप int सरणी में निम्नतम मान का सूचकांक कैसे प्राप्त करेंगे? लिंक/मोरलिंक का उपयोग करना संभव है। मुझे अब तक एक उचित लाइनर नहीं मिला।आप एक int सरणी में निम्नतम मूल्य का सूचकांक कैसे प्राप्त करेंगे?
उत्तर
जब से तुम MoreLinq, के बारे में कैसे उल्लेख:
int[] array = ..
// Will throw if the array is empty.
// If there are duplicate minimum values, the one with the smaller
// index will be chosen.
int minIndex = array.AsSmartEnumerable()
.MinBy(entry => entry.Value)
.Index;
एक अन्य विकल्प:
// Will throw if the array is empty.
// Requires two passes over the array.
int minIndex = Array.IndexOf(array, array.Min());
आप निश्चित रूप से अपने खुद के विस्तार-विधि लिख सकते हैं:
// Returns last index of the value that is the minimum.
public static int IndexOfMin(this IEnumerable<int> source)
{
if(source == null)
throw new ArgumentNullException("source");
int minValue = int.MaxValue;
int minIndex = -1;
int index = -1;
foreach(int num in source)
{
index++;
if(num <= minValue)
{
minValue = num;
minIndex = index;
}
}
if(index == -1)
throw new InvalidOperationException("Sequence was empty");
return minIndex;
}
कुछ प्रयास के साथ , आप IComparer<T>
को स्वीकार कर किसी भी प्रकार से इसे सामान्यीकृत कर सकते हैं,पर डिफॉल्ट।
आपने एक्सटेंशन विधि में फ़ोरैच क्यों चुना है? – mafu
सामान्य रूप से, अनुक्रमों को अनुक्रम द्वारा एक्सेस नहीं किया जा सकता है। एक 'foreach' का उपयोग करना मनमाना अनुक्रम को फिर से शुरू करने का सामान्य तरीका है। आप * गणनाकर्ता प्राप्त कर सकते हैं और फिर 'लूप' का उपयोग कर सकते हैं, लेकिन यह काफी गन्दा दिखता है। यदि आपको वास्तव में गणनाकर्ता की आवश्यकता है, तो 'while' लूप कहीं अधिक आम है। इस मामले में, न तो आवश्यक है। – Ani
ओह, हाँ, मैं गलती से 'स्रोत' के बारे में सोच रहा था। – mafu
बहुत स्मृति अनुकूल नहीं है, लेकिन ...
array.Select((n, i) => new { index = i, value = n })
.OrderBy(item => item.value)
.First().index
आप ऑर्डरबी/फर्स्ट को मिनीबी के साथ भी बदल सकते हैं। – mafu
@ mafutrct: हाँ यदि आपके पास MoreLinq है, जो आप करते हैं लेकिन मैं नहीं करता :) –
यह बदसूरत है, लेकिन यह केवल अनुक्रम के माध्यम से एक भी पास की जरूरत है और केवल का उपयोग करता है में निर्मित ढांचे तरीके:
int index = yourArray.Select((x, i) => new { Val = x, Idx = i })
.Aggregate(new { Val = -1, Idx = -1 },
(a, x) => (x.Idx == 0 || x.Val < a.Val) ? x : a,
x => x.Idx);
और, जाहिर है, आप एक सामान्य प्रयोजन विस्तार विधि लिख सकते हैं:
int index = yourArray.MinIndex();
// ...
public static class EnumerableExtensions
{
public static int MinIndex<T>(
this IEnumerable<T> source, IComparer<T> comparer = null)
{
if (source == null)
throw new ArgumentNullException("source");
if (comparer == null)
comparer = Comparer<T>.Default;
using (var enumerator = source.GetEnumerator())
{
if (!enumerator.MoveNext())
return -1; // or maybe throw InvalidOperationException
int minIndex = 0;
T minValue = enumerator.Current;
int index = 0;
while (enumerator.MoveNext())
{
index++;
if (comparer.Compare(enumerator.Current, minValue) < 0)
{
minIndex = index;
minValue = enumerator.Current;
}
}
return minIndex;
}
}
}
LINQ शायद सबसे अच्छा समाधान च नहीं है या यह समस्या, लेकिन यहां एक और भिन्नता है जो ओ (एन) है। यह सॉर्ट नहीं करता है और केवल एक बार सरणी को घुमाता है।
var arr = new int[] { 3, 1, 0, 5 };
int pos = Enumerable.Range(0, arr.Length)
.Aggregate((a, b) => (arr[a] < arr[b]) ? a : b); // returns 2
अद्यतन: मूल प्रश्न सीधे उत्तर देना, यह कैसे मैं यह कर देगी:
var arr = new int[] { 3, 1, 0, 5 };
int pos = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] < arr[pos]) { pos = i; }
}
// pos == 2
नहीं, यह LINQ का उपयोग नहीं करता। हां, यह एक से अधिक पंक्ति है। लेकिन यह वास्तव में सरल और वास्तव में तेज़ है। इसे एक छोटी सी छोटी विधि में बनाएं और इसे किसी भी पंक्ति से कहीं भी कॉल करें: pos = FindMinIndex(arr);
- 1. MongoDB में, कैसे आप एक सरणी तत्व अपने सूचकांक
- 2. सी # में एक सरणी सूचकांक
- 3. जावास्क्रिप्ट में सरणी के एक विशिष्ट सूचकांक पर मूल्य कैसे प्राप्त करें?
- 4. सरणी सूचकांक और पता वापस एक ही मूल्य
- 5. जावा int [] [] सरणी - पुनरावृत्ति और मूल्य
- 6. LINQ का उपयोग कर सरणी में उच्चतम मान का सूचकांक कैसे प्राप्त करूं?
- 7. पीएस: एक सरणी सूची में सूचकांक प्राप्त करें
- 8. ट्विग में एक बहुआयामी सरणी से मूल्य कैसे प्राप्त करें?
- 9. निम्नतम C++
- 10. सी ++ सरणी [सूचकांक] सूचकांक बनाम [सरणी]
- 11. एक इंटीजर के int मूल्य में वृद्धि?
- 12. आप .NET स्ट्रिंग से यूनिकोड कोड बिंदुओं की सरणी कैसे प्राप्त करेंगे?
- 13. सी #: आप GetHashCode का परीक्षण कैसे करेंगे?
- 14. चतुर: कैसे साहचर्य सरणी सूचकांक
- 15. स्कैला में सूची में अधिकतम मूल्य का सूचकांक कैसे प्राप्त कर सकता हूं?
- 16. एक चार सरणी में एक int स्टोर?
- 17. सरणी सूचकांक
- 18. एक सरणी में वार का मूल्य धकेल
- 19. आप एक एसएसएल कनेक्शन का परीक्षण कैसे करेंगे?
- 20. jQuery: सरणी में तत्व का सूचकांक जहां
- 21. आप छवियों की ऊंचाई को कैसे प्राप्त करेंगे?
- 22. रेल पर रूबी: एक विशिष्ट कॉलम के निम्नतम मूल्य के साथ रिकॉर्ड प्राप्त करें
- 23. आप पूंछ को कुशलतापूर्वक कैसे कार्यान्वित करेंगे?
- 24. एक पूर्व निर्धारित सरणी में दिए गए मान का सबसे कम सूचकांक
- 25. LINQ का उपयोग कर एक int सरणी में शीर्ष 3 तत्व कैसे प्राप्त करें?
- 26. आप डीएलएल आयात हस्ताक्षर कैसे घोषित करेंगे?
- 27. एक चर के व्यक्तिगत बाइट्स का मूल्य कैसे प्राप्त करें?
- 28. 1 डी सरणी सूचकांक 2 डी सरणी सूचकांक
- 29. एक क्रमबद्ध Numpy सरणी के मूल सूचकांक प्राप्त करें
- 30. आप किस डिजाइन पैटर्न का चयन करेंगे?
क्या सरणी में डुप्लिकेट संख्या हो सकती है, और इस मामले में, यदि आप निम्नतम संख्या में से दो हैं तो आप कौन सी अनुक्रमणिका दिखाना चाहते हैं ? – Paddy
@Paddy हां डुप्लिकेट संभव है। इनमें से कोई भी वापस लौटने के लिए ठीक है, हालांकि एक (किसी भी) लगातार व्यवहार की सराहना की जाएगी (उदाहरण के लिए हमेशा अंतिम)। – mafu