public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } StringBuilder stringBuilder = new StringBuilder(); StringUtils.SnakeCaseState snakeCaseState = StringUtils.SnakeCaseState.Start; for (int i = 0; i < s.Length; i++) { if (s[i] == ' ') { if (snakeCaseState != StringUtils.SnakeCaseState.Start) { snakeCaseState = StringUtils.SnakeCaseState.NewWord; } } else if (char.IsUpper(s[i])) { switch (snakeCaseState) { case StringUtils.SnakeCaseState.Lower: case StringUtils.SnakeCaseState.NewWord: { stringBuilder.Append('\u005F'); break; } case StringUtils.SnakeCaseState.Upper: { if (!(i > 0 & i + 1 < s.Length)) { break; } char chr = s[i + 1]; if (char.IsUpper(chr) || chr == '\u005F') { break; } stringBuilder.Append('\u005F'); break; } } char lower = char.ToLower(s[i], CultureInfo.InvariantCulture); stringBuilder.Append(lower); snakeCaseState = StringUtils.SnakeCaseState.Upper; } else if (s[i] != '\u005F') { if (snakeCaseState == StringUtils.SnakeCaseState.NewWord) { stringBuilder.Append('\u005F'); } stringBuilder.Append(s[i]); snakeCaseState = StringUtils.SnakeCaseState.Lower; } else { stringBuilder.Append('\u005F'); snakeCaseState = StringUtils.SnakeCaseState.Start; } } return(stringBuilder.ToString()); }
public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) { return(s); } StringBuilder stringBuilder = new StringBuilder(); StringUtils.SnakeCaseState snakeCaseState = StringUtils.SnakeCaseState.Start; for (int index = 0; index < s.Length; ++index) { if (s[index] == ' ') { if (snakeCaseState != StringUtils.SnakeCaseState.Start) { snakeCaseState = StringUtils.SnakeCaseState.NewWord; } } else if (char.IsUpper(s[index])) { switch (snakeCaseState) { case StringUtils.SnakeCaseState.Lower: case StringUtils.SnakeCaseState.NewWord: stringBuilder.Append('_'); break; case StringUtils.SnakeCaseState.Upper: bool flag = index + 1 < s.Length; if (index > 0 & flag) { char c = s[index + 1]; if (!char.IsUpper(c) && c != '_') { stringBuilder.Append('_'); break; } break; } break; } char lower = char.ToLower(s[index], CultureInfo.InvariantCulture); stringBuilder.Append(lower); snakeCaseState = StringUtils.SnakeCaseState.Upper; } else if (s[index] == '_') { stringBuilder.Append('_'); snakeCaseState = StringUtils.SnakeCaseState.Start; } else { if (snakeCaseState == StringUtils.SnakeCaseState.NewWord) { stringBuilder.Append('_'); } stringBuilder.Append(s[index]); snakeCaseState = StringUtils.SnakeCaseState.Lower; } } return(stringBuilder.ToString()); }