2012-09-21 5 views
14

पर "मुखौटा" लागू करें मेरे पास ध्वज गणना (int) मास्क है, और मुझे इसे एक सप्ताह के दिन का प्रतिनिधित्व करने वाली स्ट्रिंग में बदलने की आवश्यकता है।स्ट्रिंग

कहते हैं कि यह पूर्ण स्ट्रिंग और एक मनमाना मुखौटा

strFullWeek = "MTWtFSs" 
strWeekMask = "0100110" 
----------------------- 
strResult = "-T--FS-" 

किस तरह से आप पूरे सप्ताह और मुखौटा तार से strResult प्राप्त करने का प्रस्ताव होता है?

अद्यतन

यह मेरी "पूरे संदर्भ" (VB.NET)

<Flags()> Public Enum Week 
    Monday = 1 
    Tuesday = 2 
    Wednesday = 4 
    Thursday = 8 
    Friday = 16 
    Saturday = 32 
    Sunday = 64 
End Enum 

Dim mondayOrSunday = Week.Monday Or Week.Sunday 
Dim strDays = "MTWtFSs" 

Dim strMondayOrSundayBinary = Convert.ToString(
    mondayOrSunday, 2).PadRight(7, CChar("0")) 

Dim charMondayOrSunday = strDays.Zip(
    strMondayOrSundayBinary, 
    Function(day, mask) If(mask = CChar("1"), day, CChar("-"))).ToArray() 

Dim strMondayOrSunday = New String(charMondayOrSunday) 

Console.WriteLine("{0} I see as {1}", 
        mondayOrSunday, 
        strMondayOrSunday) 
+0

आप किस बारे में अधिक चिंतित हैं? गति, रखरखाव/पठनीयता, कोड की कम से कम लाइनें? –

उत्तर

20

एक यथोचित साफ LINQ तरीका उपलब्ध नहीं है:

var chars = strFullWeek.Zip(strWeekMask, (day, mask) => mask == '1' ? day : '-')) 
         .ToArray(); 
string text = new string(chars); 

यह बहुत कुशल नहीं होगा, लेकिन यह काफी अच्छा हो सकता है ...

संपादित करें: ठीक है, मान लीजिए कि आप enum vers के लिए सी # कोड से खुश हैं आयन

// TODO: Rename "Week" to comply with .NET naming conventions 
Week mask = Week.Monday | Week.Sunday; 
var chars = strFullWeek.Select((value, index) => (int) mask & (1 << index) != 0) 
               ? value : '-') 
         .ToArray(); 
string text = new string(chars); 
+0

'strWeekMask' प्राप्त करने के लिए मैंने' कन्वर्ट। टोस्टिंग (myEnum, 2) 'का उपयोग किया ... शायद मैं सीधे enum का उपयोग कर सकता था? – serhio

+7

तो * है * 'ज़िप()' के लिए उपयोग है ... – Laoujin

+0

@ सेरियियो: हां, लगभग निश्चित रूप से। हमें पूरा संदर्भ दें और हम आपको एक बेहतर उत्तर देने में सक्षम होंगे। –

3

ये रहा:

var strFullWeek = "MTWtFSs"; 
var strWeekMask = "0100110"; 

var strFullWeekArray = strFullWeek.ToList(); 
var strWeekMaskArray = strWeekMask.ToList(); 

Console.WriteLine(string.Join(
    string.Empty, 
    strFullWeek.Select(c => (strWeekMaskArray[strFullWeekArray.IndexOf(c)] == '1') 
     ? c 
     : '-'))); 
2

यहाँ एक विकल्प है कि आप पठनीयता के लिए देख रहे हैं:

string fullWeek = "MTWtFSs"; 
string weekMask = "0100110"; 

const char blankChar = '-'; 

int totalChars = fullWeek.Length; 

StringBuilder result = new StringBuilder(); 

for (int index = 0; index < totalChars; index++) 
{ 
    if (weekMask[index] == '1') 
    { 
     result.Append(fullWeek[index]); 
    } 
    else 
    { 
     result.Append(blankChar); 
    } 
} 

Console.WriteLine(result); 
5

मेरे शीघ्र समाधान एक StringBuilder उपयोग करता है। यह आपको एक स्ट्रिंग इन-प्लेस में हेरफेर करने की अनुमति देता है। लेकिन जब तक आप इस कोड को दस लाख बार नहीं बुला रहे हैं, तो आपको LINQ समाधान की तुलना में गति में कोई अंतर नहीं दिखाई देगा।

string strFullWeek = "MTWtFSs"; 
string strWeekMask = "0100110"; 

var sb = new StringBuilder(strFullWeek); 
for (int i = 0; i < strWeekMask.Length; i++) { 
    if (strWeekMask[i] == '0') { 
     sb[i] = '-'; 
    } 
} 
string result = sb.ToString(); 
1

मुझे पार्टी के लिए देर हो चुकी है; लेकिन मैं कोशिश करना चाहता था। यहाँ मेरी कम शांत LINQ दृष्टिकोण है:

var result = new string(strFullWeek.Select((letter, index) 
         => strWeekMask[index] == '1' ? letter : '-').ToArray()); 
1

आप सीधे गणना का उपयोग करना चाहते हैं, तो आप कुछ इस तरह के साथ ऐसा कर सकता है:

[Flags()] 
enum Week 
{ 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 4, 
    Thursday = 8, 
    Friday = 16, 
    Saturday = 32, 
    Sunday = 64 
} 

const string strFullWeek = "MTWtFSs"; 

string GetMaskedWeek(Week days) 
{ 
    char[] result = new char[strFullWeek.Length]; 
    for (int i = 0; i < strFullWeek.Length; i++) 
    { 
     if ((((int)days >> i) & 1) != 0) 
      result[i] = strFullWeek.ToCharArray(i, 1)[0]; 
     else 
      result[i] = '-'; 
    } 
    return new string(result); 
} 

या, VB.NET में:

<Flags()> Public Enum Week 
    Monday = 1 
    Tuesday = 2 
    Wednesday = 4 
    Thursday = 8 
    Friday = 16 
    Saturday = 32 
    Sunday = 64 
End Enum 

Dim strFullWeek As String = "MTWtFSs" 

Private Function GetMaskedWeek(ByVal days As Week) As String 
    Dim result(strFullWeek.Length) As Char 
    For i As Integer = 0 To strFullWeek.Length - 1 
     If ((days >> i) And 1) <> 0 Then 
      result(i) = strFullWeek.ToCharArray(i, 1)(0) 
     Else 
      result(i) = "-"c 
     End If 
    Next 
    Return New String(result) 
End Function 
+0

गुरुवार = 8;) – serhio

+0

वास्तव में जो मैंने मूल रूप से किया था, लेकिन मैंने इसे प्रश्न में enum से मिलान करने के लिए अद्यतन किया, जो गुरुवार को 16 के रूप में है :) –

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