对字符串应用"掩码"

ser*_*hio 14 .net c# vb.net string

我有一个标志枚举(int)掩码,我需要将其转换为表示一周中的日期的字符串.

说这是FULL字符串和任意掩码

strFullWeek = "MTWtFSs"
strWeekMask = "0100110"
-----------------------
strResult   = "-T--FS-"
Run Code Online (Sandbox Code Playgroud)

你建议从整周和掩盖字符串中获取strResult的方式是什么?

UPDATE

这是我的"整个上下文"(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)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

有一个相当简洁的LINQ方式:

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

它不会非常有效,但它可能足够好......

编辑:好的,假设您对枚举版本的C#代码感到满意

// 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);
Run Code Online (Sandbox Code Playgroud)


Oli*_*bes 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();
Run Code Online (Sandbox Code Playgroud)