2017-12-14 119 views
5

द्विआधारी मानों की सूची है: संक्रमण सूची के आसन्न आइटम के लिए मूल्य संचारण, सी # में

List<bool> myList = new List<bool>(){true, true, false, false, true, false, false, false, true, true, true, false, false}; 

मेरी एल्गोरिथ्म करना है, सच के लिए किसी भी झूठी आइटम परिवर्तित करने के लिए अगर वे एक सच्चे के निकट हैं मूल्य:

result = {true, true, true, true, true, true, false, true, true, true, true, true, false} 

मेरा समाधान काम करता है, जैसा कि आप देखेंगे। मैं दो अलग-अलग छोरों के माध्यम से यह कर सकते हैं, और उसके बाद दो सूचियों ज़िप:

List<bool> firstList = new List<bool>(); 
List<bool> secondList = new List<bool>(); 
for(int i=0; i<myList.Count()-1; i++){ 
    if(myList[i]==true){ 
    firstList[i]=true; 
    firstList[i+1]=true; 
    } 
} 

for(int i=1; i<myList.Count(); i++){ 
    if(myList[i]==true){ 
    secondList[i]=true; 
    secondList[i-1]=true; 
    } 
} 

List<bool> finalList = firstList.Zip(secondList, (a,b)=>a||b).ToList(); 

हालांकि, यह बाद से समस्या बहुत आसान लग रहा है सबसे अच्छा समाधान होने के लिए प्रतीत नहीं होता। एक लूप के माध्यम से या अधिमानतः linq का उपयोग करने के लिए कोई विचार है?

उत्तर

6

यहाँ एक Linq दृष्टिकोण

मूल रूप से यह अपने दृष्टिकोण के रूप में ही व्यवहार किया है।

List<bool> result = myList.Select((x, i) => x || myList.ElementAtOrDefault(i - 1) || myList.ElementAtOrDefault(i + 1)).ToList(); 
+0

कुल उपयोग क्यों नहीं करते? –

6

आप एक पाश में यह कर सकते हैं:

List<bool> result = myList.Select((b, index) => 
        b || 
        (index > 0 && myList[index-1]) || 
        (index < (myList.Count - 1) && myList[index+1])).ToList(); 

यह है कि अगर यह अपने आप या adjacting मूल्यों true हैं (index के माध्यम से) अपने myList और चेक में हर b लेता है। बेशक हमें सूची सीमाओं के लिए index जांचना होगा। तत्व स्वयं x, पिछले .ElementAtOrDefault(i - 1) या अगले .ElementAtOrDefault(i + 1) तत्व सच हो गया है -

+0

@ स्मार्ट समाधान के लिए धन्यवाद। थप्पड़ ऊपर है लेकिन यदि आप दिमाग में नहीं हैं, तो मैं fubo के समाधान को स्वीकार करता हूं। मुझे ElementAtOrDefault विधि का उपयोग करने का तरीका पसंद है। –

+2

@ आर्यनफिरौज़ियान ठीक है, अपनी जरूरतों को पूरा करने वाले व्यक्ति को स्वीकार करें। 'ElementAtOrDefault()' वास्तव में अच्छा है। –

1

मुझे नहीं लगता कि यह विशेष रूप से पठनीय है, लेकिन:

var indexesToChange = 
    Enumerable.Range(0, myList.Count) 
    .Where(n => myList[n] 
     || (n-1 >= 0 && myList[n-1]) 
     || (n+1 < myList.Count && myList[n+1])) 
    .ToList(); 

foreach (var i in indexesToChange) 
{ 
    myList[i] = true; 
} 

इस वर्ष सूची अद्यतन करेगा। यदि आप पुराने को बदलना नहीं चाहते हैं तो आप foreach लूप में एक नई सूची में प्रतिलिपि बना सकते हैं।

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

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