csharp-string

修饰符

$ before string

// $ is short-hand for String.Format and is used with string interpolations,
// which is a new feature of C# 6. As used in your case, it does nothing, just as string.Format() would do nothing.

var anInt = 1;
var aBool = true;
var aString = "3";
var aFloat = 12.3456
var formated = string.Format("{0},{1},{2}", anInt, aBool, aString);

// same result
var formated = $"{anInt},{aBool},{aString},{aFloat:f2}";
aFloat = 12.34

// 16进制转换
tb_test.Text = $"{it1:X}";

@ before string

//避免转义字符
// before
"\\\\servername\\share\\folder"

// after
@"\\servername\share\folder"

原始字符串

以至少三个双引号字符序列 (“””) 开头和结尾。 可以使用三个以上的连续字符开始和结束序列,以支持包含三个(或更多)重复引号字符的字符串字面量。
单行原始字符串字面量需要左引号和右引号字符位于同一行上。
多行原始字符串字面量需要左引号和右引号字符位于各自的行上。
在多行原始字符串字面量中,会删除右引号左侧的任何空格。

string embeddedXML = """
<element attr = "content">
<body style="normal">
Here is the main text
</body>
<footer>
Excerpts from "An amazing story"
</footer>
</element >
""";

byte[] 复制

Buffer.BlockCopy(srcArray, 0, dstArray, 0, srcArray.Length);
Array.Copy(src, dest, src.Length);

byte[] to string

string stringToConvert = "123456789abcd";
byte[] buffer = Encoding.UTF8.GetBytes(stringToConvert);
Buffer.BlockCopy(buffer, 0, rData, 0, buffer.Length);

int count = rData.Count(bt => bt != 0);//find the first null
string converted = System.Text.Encoding.ASCII.GetString(rData,0, count);
// string converted = Encoding.UTF8.GetString(rData, 0, rData.Length);


clear byte[]

Array.Clear(rData, 0, rData.Length);

删除

protocol.Param.Replace("+", string.Empty);

去掉结尾字符

s=s.TrimEnd(',')

string hex byte[]

public static string ByteArrayToString(byte[] ba)
{
return BitConverter.ToString(ba).Replace("-", "");
}

public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}

string author = "Mahesh Chand";
// Convert a C# string to a byte array
byte[] bytes = Encoding.ASCII.GetBytes(author);
foreach ( byte b in bytes)
{
Console.WriteLine(b);
}

// Convert a byte array to a C# string.
string str = Encoding.ASCII.GetString(bytes);
Console.WriteLine(str);

数字转字符串

int varInt = 1;
string varString = Convert.ToString(varInt);
string varString2 = varInt.ToString();

// C# 提供了下列内置的类型转换方法
ToDateTime
把类型(整数或字符串类型)转换为 日期-时间 结构。
ToDouble
把类型转换为双精度浮点型。

精度

// just two decimal places
String.Format("{0:0.00}", 123.4567); // "123.46"
String.Format("{0:0.00}", 123.4); // "123.40"
String.Format("{0:0.00}", 123.0); // "123.00"

// max. two decimal places
String.Format("{0:0.##}", 123.4567); // "123.46"
String.Format("{0:0.##}", 123.4); // "123.4"
String.Format("{0:0.##}", 123.0); // "123"

// at least two digits before decimal point
String.Format("{0:00.0}", 123.4567); // "123.5"
String.Format("{0:00.0}", 23.4567); // "23.5"
String.Format("{0:00.0}", 3.4567); // "03.5"
String.Format("{0:00.0}", -3.4567); // "-03.5"

String.Format("{0:0,0.0}", 12345.67); // "12,345.7"
String.Format("{0:0,0}", 12345.67); // "12,346"

String.Format("{0:0.0}", 0.0); // "0.0"
String.Format("{0:0.#}", 0.0); // "0"
String.Format("{0:#.0}", 0.0); // ".0"
String.Format("{0:#.#}", 0.0); // ""

String.Format("{0,10:0.0}", 123.4567); // " 123.5"
String.Format("{0,-10:0.0}", 123.4567); // "123.5 "
String.Format("{0,10:0.0}", -123.4567); // " -123.5"
String.Format("{0,-10:0.0}", -123.4567); // "-123.5 "

String.Format("{0:0.00;minus 0.00;zero}", 123.4567); // "123.46"
String.Format("{0:0.00;minus 0.00;zero}", -123.4567); // "minus 123.46"
String.Format("{0:0.00;minus 0.00;zero}", 0.0); // "zero"

String.Format("{0:my number is 0.0}", 12.3); // "my number is 12.3"
String.Format("{0:0aaa.bbb0}", 12.3); // "12aaa.bbb3"

大量数组转字符串

// 这个效率很低 下面同样的数据 28.423ms
int[] val = ...
var Param = string.Join(",", val);

// 这个花费 0.2839ms
StringBuilder stringBuilder = new StringBuilder();
using (StreamWriter streamWriter = new StreamWriter(@"d:\a.csv", false, Encoding.GetEncoding("utf-16")))
{
foreach (var it in data)
{
for (var i = 6; i < 3200+6; ++i)
{
// 一次性多个数据 反而慢了 用了 2ms
//stringBuilder.AppendFormat("{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},", val[i], val[i+1], val[i+2], val[i+3], val[i+4], val[i+5], val[i+6], val[i+7], val[i+8], val[i+9]);
stringBuilder.AppendFormat("{0},", it[i]);
}
streamWriter.WriteLine(stringBuilder);
}
// 去掉最后一个字符
stringBuilder.Length--;
}

//清空
stringBuilder.Length = 0;

String [] items={"Jan","Feb","Mar"};
StringBuilder sb=new StringBuilder();
foreach(var entity in items)
{
sb.Append(entity + Environment.NewLine);
}
Textbox1.Text=sb.tostring();

float int 互转

unsafe
{
float s = (float)3.194;
void* vp = &s;
// 轮廓仪默认是 0.01um, 这里转换成毫米
int i1 = (*(int*)vp);
float ss = (*(float*)&i1);
Console.WriteLine($"i={i1},ss={ss}");

}

int to byte[]

byte[] bytes = BitConverter.GetBytes(i);

byte[] to int

int iVal = BitConverter.ToInt32(rData, 0);

字符串转数字

如果确定字符串中是可以转成数字的字符,可以用int.Parse(string s),该语句返回的是转换得到的int值;
如果不能确定字符串是否可以转成数字,可以用int.TryParse(string s, out int result),该语句返回的是bool值,指示转换操作是否成功,参数result是存放转换结果的变量。

string str = string.Empty;
str = "123";
int result=int.Parse(str);

string str = string.Empty;
str = "xyz";
int result;
int.TryParse(str, out result);

string prefixedHex = "0x142CBD";
// this works, and returns 1322173
int intValue = Convert.ToInt32(prefixedHex , 16);

判断字母,数字

if (false == char.IsLetterOrDigit(elaboration[pos-1]))
{
isReplace = 1;
}

查找

Indexof(Char C):  找到第一个字符c的index,如果没找到返回-1
Indexof(string str): 找到str的index,如果没找到返回-1
LastIndexof(string str): 返回当前字符或字符串的最后一个匹配项位置


char[] chars = { '$', 'C', 'S', 'D' };
if (-1 != protocol.Param.IndexOfAny(chars))
{
Log.Warning($"发现非期望数据:{str}");
continue;
}

格式化

website

// int to string
String.Format("k{0}",m_db.m_coeffs.Count + 1)

$ - string interpolation

msdn

比 format 更具可读性

var f = 123.456;
var s = $"{f:0.00}";

// 前面补 0
int pulseInterval = 5;
var msg = $"{pulseInterval:D8}";
// msg is "00000005"

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

int count = 10
string msg = $"{msgIn}+{count:d03}";

字符转字符串

for (int i = 0; i < 12; i++)
{
m_dateMapping.Add(new ModelDateMapping
{
CurDate = $"{i + 1}",
CurDateMapString = ((char)('A' + i)).ToString()
});
Insert_model<ModelDateMapping>(m_dateMapping[0]);
}

split

string[] lines = theText.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);


string[] lines = theText.Split(new[] { "\r\n", "\r", "\n" },StringSplitOptions.None);

string[] to List

string s = [...]
var str_list = s.split(",").ToList();

正则表达式

string formular = "(-t4-t6-t8)/3";
var matches = Regex.Matches(formular, "t[0-9]+?");
foreach (var match in matches)
{
// match.Value will contain one of the matches e.g. t4, t6,t8
string s = match.ToString();
}

//判断完整词 \b

// 找到 mv 整个词,然后替换为 mvN N 对应项目编号
var record = Regex.Replace(formula, @"\b(mv)\b", $"mv{item.No}", RegexOptions.IgnorePatternWhitespace);

convert utf8 gbk

in .NET. All strings in .NET are effectively UTF-16.However, .NET provides the Encoding class to allow you to decode binary data into strings, and re-encode it later.

var encParam = EncodingConvert(protocol.Param, Encoding.GetEncoding("Unicode"), Encoding.GetEncoding("gb2312"));
public string EncodingConvert(string fromString, Encoding fromEncoding, Encoding toEncoding)
{
byte[] fromBytes = fromEncoding.GetBytes(fromString);
byte[] toBytes = Encoding.Convert(fromEncoding, toEncoding, fromBytes);

string toString = toEncoding.GetString(toBytes);
return toString;
}

public string Utf8ToGB2312(string utf8String)
{
Encoding fromEncoding = Encoding.UTF8;
Encoding toEncoding = Encoding.GetEncoding("gb2312");
return EncodingConvert(utf8String, fromEncoding, toEncoding);
}

public string GB2312ToUtf8(string gb2312String)
{
Encoding fromEncoding = Encoding.GetEncoding("gb2312");
Encoding toEncoding = Encoding.UTF8;
return EncodingConvert(gb2312String, fromEncoding, toEncoding);
}

.net core gb2312 不支持

System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
Encoding.RegisterProvider(provider);

拼接

Using + operator
String Interpolation
String.Concatenate() method
String.Join() method
String.Format() method
StringBuilder.Append() method

private StringBuilder strDatas = new StringBuilder();

strDatas.Append(str);
strDatas.Clear();
strDatas.ToString();

// 每个成员间添加 ,
string.Join(",", yourCollection)

//
string strDatas = "";
StringBuilder strBuilder = new StringBuilder();
// 准备字符串类型的 csv 格式数据
foreach (var it in datas)
{
foreach (var data in it)
{
strBuilder.Append(String.Format("{0:0.0000},", data));
}
// 去掉最后一个字符
--strBuilder.Length;
strBuilder.Append("\n");
}
strDatas += strBuilder.ToString();