如何从字符串数组创建字符字符数组? (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()
:
- 将文本字符串和参数字符串 (
" "
) 转换为字符集合
- 过滤掉文本字符集合中存在于参数字符集合中的所有字符
- returns 来自过滤文本字符集合的不同字符集合
示例 fiddle here.
可视化过程
我们以蓝色香蕉为例。
var input = "blue banana";
input.Except(" ")
将被翻译成:
{ 'b', 'l', 'u', 'e', ' ', 'b', 'a', 'n', 'a', 'n', 'a' }.Except({ ' ' })
- 过滤掉文本字符数组中出现的所有
' '
个结果:
{ 'b', 'l', 'u', 'e', 'b', 'a', 'n', 'a', 'n', 'a' }
- 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
“代理对”这句话基本上意味着表情符号将失败。
比如我有一个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()
:
- 将文本字符串和参数字符串 (
" "
) 转换为字符集合 - 过滤掉文本字符集合中存在于参数字符集合中的所有字符
- returns 来自过滤文本字符集合的不同字符集合
示例 fiddle here.
可视化过程
我们以蓝色香蕉为例。
var input = "blue banana";
input.Except(" ")
将被翻译成:
{ 'b', 'l', 'u', 'e', ' ', 'b', 'a', 'n', 'a', 'n', 'a' }.Except({ ' ' })
- 过滤掉文本字符数组中出现的所有
' '
个结果:
{ 'b', 'l', 'u', 'e', 'b', 'a', 'n', 'a', 'n', 'a' }
- 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
“代理对”这句话基本上意味着表情符号将失败。