2011-05-10 10 views
40

LINQ के साथ List<int> से निकटतम संख्या कैसे प्राप्त करें?LINQ के साथ सूची <int> से सबसे नज़दीकी संख्या कैसे प्राप्त करें?

उदाहरण के लिए:

List<int> numbers = new List<int>(); 
numbers.Add(2); 
numbers.Add(5); 
numbers.Add(7); 
numbers.Add(10) 

मैं इस मामले से 10

मैं LINQ के साथ यह कैसे कर सकते में नंबर 9. करने के लिए सूची में निकटतम मूल्य खोजने की जरूरत है?

+6

क्या आप कृपया "सूची के नजदीक" से क्या मतलब समझ सकते हैं? – NateTheGreat

+2

क्या संख्या, क्या सूची, और आपने क्या प्रयास किया है? –

+0

किसी भी प्रकार का कोड जो आप प्रदान कर सकते हैं हमेशा आपके प्रश्न को समझने में मदद करता है और इस प्रकार उत्तर दिया जाता है। :) –

उत्तर

94

आप LINQ to Objects का उपयोग करें और सूची लंबी है, तो मैं प्रयोग करेंगे:

List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 

int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y); 

इस विधि समाधान है कि एंथनी Pegram सुझाव दिया की तुलना में थोड़ा और अधिक जटिल है, लेकिन यह लाभ के रूप में है, जिसे आप पहले सूची को सॉर्ट करना नहीं है। इसका मतलब है कि O(n*log(n)) के बजाय O(n) की समय जटिलता है और O(n) के बजाय O(1) का मेमोरी उपयोग है।

+0

उत्तर के लिए धन्यवाद, इसलिए, मुझे इस भाग को समझ में नहीं आता है:? एक्स: वाई, इसका क्या अर्थ है? – ale

+1

यह हालत ऑपरेटर है। Http://msdn.microsoft.com/en-us/library/ty67wk28.aspx देखें। मैं 'x' या' y' चुनने के लिए इसका उपयोग करता हूं, इस पर निर्भर करता है कि कौन सा 'नंबर' के निकटतम है। –

+2

+1: कुल पर्याप्त उपयोग नहीं किया जाता है। शानदार उत्तर –

30

यदि आप इस कार्य को करने के लिए LINQ का उपयोग करना चाहते हैं, तो आप इसे नीचे की तरह कर सकते हैं।

List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 

// find closest to number 
int closest = list.OrderBy(item => Math.Abs(number - item)).First(); 
+3

इस समाधान का नुकसान यह है कि इसे पहले सूची को ऑर्डर करना होता है, जो सूची लंबी होने पर प्रदर्शन को नुकसान पहुंचाती है। एक समाधान के लिए मेरा उत्तर देखें जो 'ओ (एन) 'समय में मान देता है। –

+0

@ एलियन, मैं सहमत हूं। मेरा शायद अधिक पठनीय है। यदि मैं प्रदर्शन पर्याप्त नहीं था, तो मैंने LINQ से पूरी तरह से बचने के लिए एक सामान्य पाश के लिए तर्क दिया होगा, लेकिन मेरे पास अपना काम है। ;) –

+1

मैं विस्तार विधियों के बजाय LINQ का उपयोग करना पसंद करूंगा। हालांकि, यह अभी भी सुंदर कोड है। कोई समयपूर्व अनुकूलन, बस सरल साफ कोड। + उसके लिए। – Steven

2

ऊपर दिए गए समाधान सभी O(N) पर सबसे अच्छे हैं।

आप एक बड़ी सूची है और आप इस करीबी तत्व क्वेरी कई बार प्रदर्शन है, यह पहली सूची को सॉर्ट करने (O(NlogN)) और फिर प्रत्येक क्वेरी के लिए List<T>.BinarySearch का उपयोग अधिक performant होगा। k क्वेरी के लिए प्रदर्शन O((k+N)logN) है, जो पिछले विधि के O(kN) की तुलना में है।

-3

इस स्थिति का उपयोग करके आप निकटतम निचले या उच्चतर का उपयोग करें।

List<int> list = new List<int> { 2, 5, 7, 10 }; 
int number = 9; 
var closest = list.Where(numbers => numbers > number).First(); 
Console.WriteLine(closest); 
Console.ReadLine(); 

मुझे आशा है कि यह उपयोगी हो।

0

आप बाइनरी खोज कर सकते हैं। यह सी # में विधि में निर्माण है जो आपको निकटतम संख्या की खोज करने में मदद करेगा। यहां उदाहरण: https://msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx

+0

एक बाइनरी खोज को सूची को पहले क्रमबद्ध करने की आवश्यकता होती है, और इससे प्रदर्शन को नुकसान पहुंचा सकता है। – SneakyTactician

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