如何从字符串数组创建字符字符数组? (C#)

How to create char array of letters from a string array ? (C#)

比如我有一个string:

"Nice to meet you"

,当我们计算重复字母时有 13 个字母,但我想从这个字符串中创建一个 char array 个字母而不重复字母,我的意思是对于上面的字符串应该创建一个array 喜欢

{'N', 'i', 'c', 'e', 't', 'o', 'y', 'u', 'm'}

我在 google 上找了 2 个小时的答案,但我一无所获,有很多关于字符串和字符数组的答案,但不是我的情况的答案。我以为我可以通过 2 for 周期检查数组中的每个字母来编写代码,但是这次我遇到了语法错误,所以我决定问一下。

你可以这样做:

var foo = "Nice to meet you";
var fooArr = s.ToCharArray();
HashSet<char> set = new();
set.UnionWith(fooArr);

//or if you want without whitespaces you could refactor this as below
set.UnionWith(fooArr.Where(c => c != ' '));

更新: 你甚至可以做一个扩展方法:

public static IEnumerable<char> ToUniqueCharArray(this string source, char? ignoreChar)
{
     var charArray = source.ToCharArray();
     HashSet<char> set = new();
     set.UnionWith(charArray.Where(c => c != ignoreChar));
     return set;
}

然后您可以将其用作:

var foo = "Nice to meet you";
var uniqueChars = foo.ToUniqueCharArray(ignoreChar: ' ');

// if you want to keep the whitespace
var uniqueChars = foo.ToUniqueCharArray(ignoreChar: null);

这段代码可以完成工作:

var sentence = "Nice To meet you";
var arr = sentence.ToLower().Where(x => x !=' ' ).ToHashSet();
Console.WriteLine(string.Join(",", arr));

我添加了 ToLower() 如果您不区分大写和小写,如果区分大小写,您只需推迟此扩展.. HashSet 抑制所有重复字母

测试:Fiddle

这个我试过了,效果也不错

"Nice to meet you".Replace(" ", "").ToCharArray().Distinct();

字符串的 ToCharArray 方法是您唯一需要的。

using System;

public class HelloWorld
{
     public static void Main(string[] args)
    {
        string str = "Nice to meet you"; 
        char[] carr = str.ToCharArray(); 
        for(int i = 0; i < carr.Length; i++)
            Console.WriteLine (carr[i]);
     }
}

一个非常简短的解决方案是在输入字符串上使用 .Except()

string text = "Nice to meet you";

char[] letters = text.Except(" ").ToArray();

在这里,.Except()

  1. 将文本字符串和参数字符串 (" ") 转换为字符集合
  2. 过滤掉文本字符集合中存在于参数字符集合中的所有字符
  3. returns 来自过滤文本字符集合的不同字符集合

示例 fiddle here.


可视化过程

我们以蓝色香蕉为例。

var input = "blue banana";
  1. input.Except(" ") 将被翻译成:
{ 'b', 'l', 'u', 'e', ' ', 'b', 'a', 'n', 'a', 'n', 'a' }.Except({ ' ' })
  1. 过滤掉文本字符数组中出现的所有 ' ' 个结果:
{ 'b', 'l', 'u', 'e', 'b', 'a', 'n', 'a', 'n', 'a' }
  1. distinct char 集合将删除 'b''a''n' 的所有重复项,从而导致:
{ 'b', 'l', 'u', 'e', 'a', 'n' }
String str  = "Nice To meet you";
char[] letters = str.ToLower().Except(" ").ToArray();

仅使用 for-loops 的解决方案(无泛型或 Linq),并附有解释说明的注释:

// get rid of the spaces
String str = "Nice to meet you".Replace(" ", "");

// a temporary array more than long enough (we will trim it later)
char[] temp = new char[str.Length];

// the index where to insert the next char into "temp". This is also the length of the filled-in part
var idx = 0;

// loop through the source string
for (int i=0; i<str.Length; i++)
{
    // get the character at this position (NB "surrogate pairs" will fail here)
    var c = str[i];
    
    // did we find it in the following loop?
    var found = false;

    // loop through the collected characters to see if we already have it
    for (int j=0; j<idx; j++)
    {
        if (temp[j] == c)
        {
            // yes, we already have it!
            found = true;
            break;
        }
    }
    
    if (!found)
    {
        // we didn't already have it, so add
        temp[idx] = c;
        idx+=1;
    }
}

// "temp" is too long, so create a new array of the correct size
var letters = new char[idx];
Array.Copy(temp, letters, idx);
// now "letters" contains the unique letters

“代理对”这句话基本上意味着表情符号将失败。