C# 生成允许重复的排列、组合

C# 生成允许重复的排列、组合

/// <summary>
/// 获取允许重复的排列组合
/// </summary>
/// <param name="s"> 源字符串</param>
/// <param name="cnt"> 组合位数</param>
/// <returns> 生成结果</returns>
static IEnumerable<string > GetVariations(string s)
{
        int[] indexes = new int[s.Length];
        StringBuilder sb = new StringBuilder ();

        while (IncrementIndexes(indexes, s.Length))
        {
            sb.Clear();
            for ( int i = 0; i < indexes.Length; i++)
            {
                    if (indexes[i] != 0)
                    {
                            sb.Append(s[indexes[i] - 1]);
                    }
            }

            yield return sb.ToString();

        }
}

static bool IncrementIndexes( int[] indexes, int limit)
{
        for ( int i = 0; i < indexes.Length; i++)
        {
            indexes[i]++;
            if (indexes[i] > limit)
            {
                    indexes[i] = 1;
            }
            else
            {
                    return true;
            }
        }
        return false;
}

排列 和 组合的区别

排列是有顺序的,如(a,b,c)和(b,c,a)是不同的,虽然同样是三个字母,但顺序不同。

组合是没有顺序的,如(a,b,c)和(b,c,a)是相同的,只要是同样的字母组合,顺序无所谓。

C# 随机生成字符串

C# 随机生成字符串

/// <summary>
/// 生成随机纯字母组合
/// </summary>
/// <param name="count"> 位数</param>
/// <returns> 随机码</returns>
private string GetRandomString( int count)
{
        int number;
        string checkCode = String.Empty;     //存放随机码的字符串  

        System. Random random = new Random( DateTime.Now.Millisecond * 2);

        for ( int i = 0; i < count; i++) //产生4位校验码  
        {
            number = random.Next();
            number = number % 36;
            if (number < 10)
            {
                    number += 48;    //数字0-9编码在48-57  
            }
            else
            {
                    number += 55;    //字母A-Z编码在65-90  
            }

            checkCode += (( char)number).ToString();
        }
        return checkCode;
}

/// <summary>
/// 按位数取得随机码(纯数字)
/// </summary>
/// <param name="num"> 位数</param>
/// <returns> 随机码</returns>
public string GetRandomNumber( int num)
{
        string str = "";
        int seed = Math.Abs((int )BitConverter .ToUInt32(Guid.NewGuid().ToByteArray(), 0));
        Random random = new Random(seed);

        for ( int i = 0; i < num; i++)
        {
            str += random.Next(10);
        }
        return str;
}

/// <summary>
/// 生成随机字母字符串(数字字母混和)
/// </summary>
/// <param name="codeCount"> 待生成的位数 </param>
public string GetRandomCharAndNumber( int codeCount)
{
        
    string str = string.Empty;
    int rep = 0;
    long num2 = DateTime.Now.Ticks + rep;
    rep++;
    Random random = new Random((( int)((( ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep)));
    for ( int i = 0; i < codeCount; i++)
    {
        char ch;
        int num = random.Next();
        if ((num % 2) == 0)
        {
            ch = ( char)(0x30 + (( ushort)(num % 10)));
        }
        else
        {
            ch = ( char)(0x41 + (( ushort)(num % 0x1a)));
        }
        str = str + ch.ToString();
    }
    return str;
}

C#判断中文、日文、韩文

C#判断中文、日文、韩文的办法:

中文:/[\u4e00-\u9fa5]/

日文:/[\u0800-\u4e00]/

韩文:/[\uac00-\ud7ff]/

C# 正则表达式应用实例  如果要匹配 所有东亚语言 @"[\u4E00-\u9fa5]"

// 判断韩语
if  (System.Text.RegularExpressions.Regex.IsMatch(content, @"^[\uac00-\ud7ff]+$"))
{
}
 
// 判断日语
if (System.Text.RegularExpressions.Regex.IsMatch(content, @"^[\u0800-\u4e00]+$"))
{
}
 
// 判断中文
if (System.Text.RegularExpressions.Regex.IsMatch(content, @"^[\u4e00-\u9fa5]+$")) // 如果是中文
{
}

C#中的@符号详解

@符号是特殊而又实用的C#符号。

比如它在string中的应用。

1

字符@表示,其后的字符串是个“逐字字符串”(verbatim string)。 // 这个说法来自C# Primer 中文版(Stanley B. Lippman, 侯捷/陈硕合译)

2

对于逐字字符串字面变量(verbatim string literal ),我们不再需要使用“转义序列”就可以指定反斜线之类的特殊字符。@的这个特点使得在表示文件路径时很方便。

如:

string str = @"C:/Test.txt";

3

另外一点,用@表示的字符串能够跨越数行。这数行之内的空白字符(White Space)都会保留在字符串里。

这样便能允许存储和生成带有格式的文本块。

如:

string strText = @"Line1
                   Line2
                   Line3";

有意思的是如果在VS.NET2003中当你输入完第一行(string strText = @"Line1)换行后,光标会自动到第二行最开头 ^_^。很智能化、人性化的判断。

4

不知道大家在最初看到@的功能时有没有想,如果“转义序列”(/)在字符串中“失效”,那么想包含一个双引号(”),怎么办?我找到了答案。

方法很简单。在双引号之前再加一个双引号即可。

如:

string str = @"""Great!""Said Allen Lee";

5

这仅仅是@在字符串中的用法,有机会再去看看@的其他东东。

C#读写文件

C#读写文件的方法:

C#中,在含有转义字符的 字符串前加@可以避免使用转义字符

使用前要using System.IO;

StreamReader reader = new StreamReader(@"E:/main.c", Encoding.Default);            
string line;
while ((line = reader.ReadLine()) != null)
{
    Console.WriteLine(line);
}
reader.Close();
// 参数改为false可以直接重写文件
StreamWriter writer = new StreamWriter(@"E:/main.c", true, Encoding.Default);
writer.WriteLine("ok..");
writer.Close();