【问题标题】:making an char array out of string array用字符串数组制作一个字符数组
【发布时间】:2017-09-25 15:02:42
【问题描述】:

这里我有一个数组。我想按它们的第一个字母对它们进行分组,然后取出以a和b开头的字符串,char数组它们。

以下是我的尝试:

 string[] ab = { "aa", "ab", "bb", "bc", "cd", "ce" };

var aq = ab.GroupBy(i => i[0]).Where(x => x.Key == 'a' && x.Key == 'b').SelectMany(x => x.Value.ToCharArray());

我的问题是在我最后的陈述中,我无法得到 x.Value,这很奇怪,因为它属于 igroup

我还想得到一个 char 数组答案,例如 { a,a,a,b,b,b,b,c}

【问题讨论】:

  • 您不需要GroupBy 来执行此操作。
  • 任何输入将不胜感激!我也想了解这个问题。
  • “以 a 和 b 开头的字符串”是什么意思?字符串不能以 AND b. 开头
  • 一个 { a,a,a,b,b,b,b,c} 的 char 数组,来自 { "aa", "ab", "bb", "bc"}
  • 这样的?:ab.Where(s => !String.IsNullOrEmpty(s) && (s[0] == 'a' || s[0] == 'b')).SelectMany(s => s).ToArray()

标签: c# linq char


【解决方案1】:

通过检查每个字符串的第一个字符,您可以在没有GroupBy() 的情况下完成您想要的操作:

var result = ab
    .Where(x => x.ToLower()[0] == 'a' 
        || x.ToLower()[0] == 'b')
    .SelectMany(x => x)
    .ToArray();

如果您的列表中有任何 null 值,请注意不要这样做。

您还可以使用StartsWith() 扩展名并传入布尔参数以忽略大小写以及文化信息:

var result = ab
    .Where(x => x.StartsWith("a", true, System.Globalization.CultureInfo.CurrentCulture) 
        || x.StartsWith("b", true, System.Globalization.CultureInfo.CurrentCulture))
    .SelectMany(x => x)
    .ToArray();

小提琴here

【讨论】:

  • 如果列表中有空字符串怎么办?
  • 空字符串应该没问题,但是 null 会破坏索引器。然而,同样的问题仍然存在于 OP 的代码中,所以我假设 OP 在应用此逻辑之前过滤空值。
【解决方案2】:

试试这个:

var aq = ab.Where(it => it.StartsWith("a") || it.StartsWith("b"))
           .SelectMany(it => it.ToCharArray());

首先选择以“a”或“b”开头的字符串,然后将它们转换为 char 数组并将它们连接起来。

【讨论】:

  • .ToCharArray() 是多余的,可以删除。 string IEnumerable<char>
猜你喜欢
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2022-01-17
  • 2023-02-04
  • 2015-08-22
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多