2009-04-22 10 views
13

प्राप्त करें मैं एक सूची में अगला तत्व प्राप्त करना चाहता हूं और यदि सूची इसके अंत में है तो मुझे पहला तत्व चाहिए। तो मैं बस इसे दूसरे शब्दों में सर्कल करना चाहता हूं।सूची <> अगला तत्व प्राप्त करें या पहले

List<int> agents = taskdal.GetOfficeAgents(Branches.aarhusBranch); 
    if (lastAgentIDAarhus != -1) 
    { 
     int index = agents.IndexOf(lastAgentIDAarhus); 
     if (agents.Count > index + 1) 
     { 
      lastAgentIDAarhus = agents[index + 1]; 
     } 
     else 
     { 
      lastAgentIDAarhus = agents[0]; 
     } 
    } 
    else 
    { 
     lastAgentIDAarhus = agents[0]; 
    } 

मैं काफी ऊपर दिखाए गए अपने ही समाधान से नाखुश हूँ, मुझे पता है कि आप एक बेहतर एक :)

उत्तर

20
lastAgentIDAarhus = agents[index == -1 ? 0 : index % agents.Count]; 

एमओडी ऑपरेटर % के उपयोग atuomatically संभव अनुक्रमित की श्रृंखला के लिए सूचकांक कांट-छांट कर।

मॉड्यूलो ऑपरेटर DIV (/) ऑपरेटर की तारीफ है और शेष दो पूर्ण संख्याओं का विभाजन देता है। उदाहरण के लिए यदि आप 9 से 6 को विभाजित करते हैं तो परिणाम 3 के शेष के साथ 1 होता है। एमओडी ऑपरेटर 3.

+0

वाह यह काम करता है कि एक बेहद साफ समाधान है :) इसे थोड़ा सा समझाने की देखभाल? –

+0

मॉड ऑपरेटर एक मॉड्यूलो करता है, जो वही है जो आप चाहते थे। यदि आप इंडेक्स को -1 के बजाय 0 में प्रारंभ कर सकते हैं, तो आप इसका उपयोग कर सकते हैं: lastAgentIDAarhus = एजेंट [इंडेक्स% (एजेंट्स। काउंटर - 1)] – configurator

+3

मुझे लगता है कि यह 'इंडेक्स% (एजेंट। काउंटर)' –

2

नहीं एक बड़ा अंतर है, लेकिन कम से कम कुछ कम कोड (कम से कम संपादक में); ओ)

List<int> agents = taskdal.GetOfficeAgents(Branches.aarhusBranch); 
if (lastAgentIDAarhus != -1) 
{ 
    int index = agents.IndexOf(lastAgentIDAarhus); 
    lastAgentIDAarhus = (agents.Count > index + 1 ? agents[index + 1] : agents[0]); 
} 
else 
{ 
    lastAgentIDAarhus = agents[0]; 
} 
4

इस पर थोड़ा अलग लेता है, यहां एक विस्तार विधि है जिसका उपयोग आप किसी भी आईनेमरेबल ' परिपत्र '

public static IEnumerable<T> AsCircularEnumerable<T>(this IEnumerable<T> enumerable) 
    { 
    var enumerator = enumerable.GetEnumerator(); 
    if(!enumerator.MoveNext()) 
     yield break; 

    while (true) 
    { 
     yield return enumerator.Current; 
     if(!enumerator.MoveNext()) 
     enumerator = enumerable.GetEnumerator(); 
    } 
    } 

ताकि आप उस इस्तेमाल कर सकते हैं इस

var agents = new List<int> {1, 2, 3, 4, 123, 234, 345, 546}; 

    foreach(var i in agents.AsCircularEnumerable()) 
    { 
    Console.WriteLine(i); 
    } 

कौन सा बस आगे बढ़ते जाते होगा की तरह ... :)

+0

यदि सूची में 3 तत्व हैं, और यदि मैं सूची में किसी आइटम को प्राप्त करने के लिए 4 या 5 के इंडेक्स मान का उपयोग करता हूं - क्या मुझे सूची के पहले और दूसरे तत्व मिलेंगे? – BKSpurgeon

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। यदि आप उस समाधान का उपयोग करके इंडेक्सिंग के बारे में पूछ रहे हैं जो मैंने ऊपर उल्लिखित किया है, क्योंकि यह एक सूची नहीं है, यह एक आईनेमरेबल है और आप एक इंडेक्सर पर एक इंडेक्सर का उपयोग नहीं कर सकते हैं, तो नहीं, आप नहीं करेंगे। आप एजेंटों की तरह कुछ उपयोग कर सकते हैं। AsCircularEnumerable()। छोड़ें (10)। सबसे पहले() इसके बजाए। –

11

या बस:

public static T NextOf<T>(this IList<T> list, T item) 
{ 
    return list[(list.IndexOf(item) + 1) == list.Count ? 0 : (list.IndexOf(item) + 1)]; 
} 

उदाहरण:

List<string> names = new List<string>(); 

names.Add("jonh"); 
names.Add("mary"); 

string name = String.Empty;  

name = names.NextOf(null); //name == jonh 

name = names.NextOf("jonh"); //name == mary 

name = names.NextOf("mary"); //name == jonh 
3

मैं एक विस्तार पद्धति का उपयोग करके की Vinicius's idea पसंद है। दुर्भाग्य से वह जो कोड पोस्ट करता है वह अपवाद फेंक देगा। यह अपने पर आधारित है, लेकिन यह एक अपवाद फेंक नहीं है और यह बहुत पढ़ने के लिए सरल और आसान (IMHO) है:

public static T Next<T>(this IList<T> list, T item) 
{ 
    var nextIndex = list.IndexOf(item) + 1; 

    if (nextIndex == list.Count) 
    { 
     return list[0]; 
    } 

    return list[nextIndex]; 
} 

यह सूची में पहला आइटम वापस आ जाएगी यदि आइटम में पारित में नहीं है सूची, list.IndexOf(item) उस मामले में -1 लौटाएगी;

+0

कोवरस, जहां अपवाद उठाएगा? –

+0

उस सूची को याद रखें। इंडेक्सऑफ (आइटम) -1 आइटम लौटाएगा यदि कोई आइटम नहीं मिला है। –

+0

यह एक विस्तार के लिए वास्तव में एक अच्छा विचार है। मैंने इसे थोड़ा सा संशोधित किया और इसे कार्यान्वित किया :) – etalon11

0

यदि आप सामान्य त्रुटियों से बचने के लिए कुछ चेक जोड़ते हैं तो आपको क्या लगता है?

public static class ListExtensions 
{ 
    public static TType Next<TType>(this IList<TType> list, TType item) 
    { 
     if (list == null) return default(TType); 

     var itemIndex = list.IndexOf(item); 
     if (itemIndex < 0) return list.FirstOrDefault(); 

     var nextIndex = itemIndex + 1; 

     return nextIndex >= list.Count 
      ? list.FirstOrDefault() 
      : list[nextIndex]; 
    } 
} 
-4

स्ट्रिंग लाइन = लाइनों [lines.FindIndex (x => x.Contains (आइटम)) + 1];

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