我想要一行将字符串数组转换为字符数组的代码(最好使用 C# LINQ)。如果 char 数组是不同的会更好。
答案 0 :(得分:3)
char[] distinctChars = stringArray.SelectMany(s => s).Distinct().ToArray();
这是有效的,因为 String
实现了 IEnumerable<char>
。
答案 1 :(得分:0)
.net class string 实现了 IEnumerable<char>
。
这意味着,每当您看到一个字符串时,您都可以将其视为一个字符序列。
此外,如果您有多个相似类型的序列,并且您想将其视为一个序列,请考虑使用 Enumerable.Concat
唉,Concat 仅在您在编译时知道您有多少序列时才有效:Concat 两个或三个序列很容易。但是如果你不知道你有多少个序列,或者如果有很多序列,你就不能使用 Concat。 Concat 100 字符串会很麻烦。
(顺便说一句,我使用序列来防止说:列表或数组或集合或...)
每当您有一个序列,其中每个元素都有零个或多个子序列,并且您想将其视为一个大序列时,请考虑使用 SelectMany。
因此,如果您有一个学校列表,并且每个学校都有一个学生列表,那么如果您想要一个包含所有学校的所有学生的大列表,请使用 SelectMany。
在您的情况下:您有一个字符串列表,每个字符串都是一个字符序列,并且您想要所有字符串中所有字符的一个大序列:使用 SelectMany。
SelectMany 有几个重载。我最常使用的是带有参数 resultSelector 的重载。
在我的 Schools 和 Students 示例中,我告诉 Linq 您要使用哪个子序列,并且在参数 resultSelector 中,您选取一个 School 和这个 School 上的一个 Student 来创建一个新对象。为所有学校和所有学生执行此操作。
IEnumerable<School> schools = ...
IEnumerable<Student> allStudentsOnAllSchools = schools.SelectMany(school => school.Students,
// parameter resultSelector: take a school and a student to make one new:
(school, student) => new
{
// select the properties that you want to use:
SchoolId = school.Id,
StudentId = student.Id,
Description = String.Format("Student {0} studies at school {1},
student.Name,
school.Name,
});
一句话:从每所学校,取他们的学生,从[学校,学生]的每一个组合中制作一个新对象,其中包含学校和学生的ID以及带有学校和学生名称的描述< /p>
您的情况类似,除了您的字符串没有具有字符序列,它是字符序列。因此,您的子序列是输入序列的一个元素。
IEnumerable<string> lines = ...
IEnumerable<char> allUsedCharacters = lines.SelectMany(line => line,
(line, charInThisLine) => charInThisLine);
In words:从 Lines 序列中的每一行,取出该行中的所有字符。从[line, characterInThisLine]的组合中,只保留这一行的字符。您不再需要线路了。
要删除重复字符,请添加:
.Distinct();