2013-08-14 11 views
8

मान लें कि एक सरणी अनुक्रमिक है जब प्रत्येक सफल तत्व के पिछले तत्व + 1 का मान होता है। मान लीजिए कि मेरे पास {5,6,7,8} (अनुक्रमिक) या {1,2,5} (अनुक्रमिक नहीं) जैसी संख्याओं की एक श्रृंखला है।संख्याओं की सरणी अनुक्रमिक है

क्या यह जांचने के लिए एक अच्छा कार्यात्मक तरीका है कि सरणी अनुक्रमिक है या नहीं? मैं इसे निम्नलिखित कोड के साथ कर सकता हूं:

bool IsSequential(int[] array) 
{ 
    for (int i = 1; i < array.Length; i++) 
     if (array[i] != array[i - 1] + 1) 
      return false; 
    return true; 
} 

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि पोकर हाथ सीधे है या नहीं।

+0

संभावित डुप्लिकेट [सुनिश्चित करें कि सरणी सी # में अनुक्रमिक है) (http://stackoverflow.com/questions/5413272/make-sure-array-is-sequential-in-c-sharp) – Gabe

+0

आप कैसे निपटते हैं इक्का? यदि इसका मान 1 है, तो आप इस विधि का उपयोग सीधे एक उच्च-उच्च का पता लगाने के लिए नहीं कर सकते हैं। – Gabe

+2

आपका कोड सरल है और पूरी तरह से काम करें –

उत्तर

8

इस एक का प्रयास करें:

bool IsSequential(int[] array) 
    { 
     return array.Zip(array.Skip(1), (a, b) => (a + 1) == b).All(x => x); 
    } 
+1

इसके लिए LINQ की आवश्यकता है। – Gabe

+0

@AlexeiLevenkov: यदि आप 'छोड़ें' का उपयोग नहीं करते हैं, तो आप केवल तत्वों की तुलना अपने साथ कर रहे हैं, जो निश्चित रूप से हमेशा बराबर होंगे। – Gabe

2

मैं अगर यह वास्तव में एक सुधार/अच्छे है, लेकिन आप रेंज इस्तेमाल कर सकते हैं पता नहीं है।

ENumerable.Range(0, myArray.Length).Any(i => myArray[i] != myArray[0] + i) 

यदि सरणी में अनुक्रमिक संख्या नहीं है तो यह सच हो जाता है।

1

एक ही रूप में: make sure array is sequential in C#

वहाँ उत्तर:

यदि आप यह सुनिश्चित करें कि सरणी हल कर और कोई डुप्लिकेट है कर रहे हैं, तो आप सिर्फ देख सकते हैं:

array[array.Length - 1] == array[0] + array.Length - 1 
+0

यह गलत है, इसके साथ आप पहले और आखिरी के मुकाबले अन्य तत्वों के बारे में कुछ नहीं जान सकते हैं। – Serge

+0

@ सर्ज यही कारण है कि: यदि आप सुनिश्चित हैं कि सरणी सॉर्ट की गई है और इसमें कोई डुप्लिकेट नहीं है। यदि ऐसा है - तो जवाब सही है। सोचो क्यों! – sara

1
var result = Enumerable.Range(array[0], array[array.Length-1]).Except(array.ToList()); 
2

लिंक का उपयोग:

public static bool IsSequential(int[] a) 
    { 
     return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]); 
    } 
2

यह सभी क्रमिक, अनुक्रमिक डेटा के लिए चाल करना चाहिए। नमूना इनपुट के साथ एक पूर्ण उदाहरण। परीक्षण किया गया और ठीक

var list = new List<int>(new[] { 7, 6, 5, 4, 3,9}); 
int minValue = list.Min(); 
int maxValue = list.Count; 
List<int> test = Enumerable.Range(minValue, maxValue).ToList(); 
var result = Enumerable.Range(minValue, maxValue).Except(list); 
if (result.ToList().Count == 0) 
{ 
    Console.WriteLine("numbers are in sequence"); 
} 
else 
{    
    Console.WriteLine("Numbers are not in sequence"); 
} 
0

पहले प्रकार सरणी काम करता है, को दूर एक तरह के एन (जैसे जोड़े) अलग (प्रयोग करके) और सरणी लंबाई हमेशा से 5 == रहा है, तो तुम सब करने की ज़रूरत है, तो है ((सरणी [4] - सरणी [0]) == 4) सच वापसी।

यह अधिक जटिल हो जाता है यदि उसके टेक्सास होल्डम या यदि आपको दोनों को उच्च और अधिक सीधे दोनों के लिए खाते की आवश्यकता है।

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