有没有办法使用 LINQ 将字符串数组转换为字符数组?

时间:2021-03-01 15:56:31

标签: c# linq

我想要一行将字符串数组转换为字符数组的代码(最好使用 C# LINQ)。如果 char 数组是不同的会更好。

2 个答案:

答案 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 字符串会很麻烦。

Enumerable.SelectMany 来救援!

(顺便说一句,我使用序列来防止说:列表或数组或集合或...)

每当您有一个序列,其中每个元素都有零个或多个子序列,并且您想将其视为一个大序列时,请考虑使用 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();