如何在C#中按字母顺序打印字符串中出现的字符?

如何在C#中按字母顺序打印字符串中出现的字符?,c#,string,sorting,C#,String,Sorting,有谁能帮我找到一种最有效的方法,以字母顺序将字符和该字符一起打印在给定字符串中 我能计算字符串中字符的出现次数,但不能按字母顺序排序 string OutputString = string.Empty; int count = 1; char[] charArr = inputString.ToCharArray(); for (int i = 0; i < charArr.Length; i++) { for (int j = i + 1; j < charArr.Len

有谁能帮我找到一种最有效的方法,以字母顺序将字符和该字符一起打印在给定字符串中

我能计算字符串中字符的出现次数,但不能按字母顺序排序

string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++) {
    for (int j = i + 1; j < charArr.Length; j++) {
        if (charArr[i] == charArr[j])
            count++;
    }
    if (!OutputString.Contains(charArr[i]))
        OutputString += charArr[i].ToString() + count.ToString();

    count = 1;
}
OutputString = string.Concat(OutputString.OrderBy(c => c));

您可以使用Linq来简化此过程:

string s = "xgdgyd";

var result = s
   .GroupBy(c => c)
   .Select(g => g.Key.ToString() + g.Count())
   .OrderBy(x => x);

Console.WriteLine(string.Concat(result)); // Outputs "d2g2x1y1"
这里最有用的是
GroupBy()
,它将所有相同的项目组合在一起。这允许我们使用
g.Count()
来计算每组中的项目数

然后我们将每个组键(一个字符)及其计数连接到一个字符串中


(我已经将代码简化为使用string.Concat()而不是string.Join()。

您可以使用Linq来简化:

string s = "xgdgyd";

var result = s
   .GroupBy(c => c)
   .Select(g => g.Key.ToString() + g.Count())
   .OrderBy(x => x);

Console.WriteLine(string.Concat(result)); // Outputs "d2g2x1y1"
这里最有用的是
GroupBy()
,它将所有相同的项目组合在一起。这允许我们使用
g.Count()
来计算每组中的项目数

然后我们将每个组键(一个字符)及其计数连接到一个字符串中


(我已经将代码简化为使用string.Concat()而不是string.Join()。

由@Matthew with LINQ给出的解决方案是完美的,但是如果您想要一个带有for循环的解决方案,如您所述,请执行此操作

首先对inputString进行排序,然后删除最后对OutputString进行排序的代码行,如下所示:

string inputString = "xgdgyd";

inputString = string.Concat(inputString.OrderBy(c => c));

string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++)
{
  for (int j = i + 1; j < charArr.Length; j++)
  {
    if (charArr[i] == charArr[j])
      count++;
  }
  if (!OutputString.Contains(charArr[i]))
    OutputString += charArr[i].ToString() + count.ToString();

  count = 1;
}
string inputString=“xgdgyd”;
inputString=string.Concat(inputString.OrderBy(c=>c));
string OutputString=string.Empty;
整数计数=1;
char[]charArr=inputString.ToCharArray();
for(int i=0;i
由@Matthew with LINQ给出的解决方案是完美的,但是如果您想要一个带有for循环的解决方案,正如您所发布的那样,那么就这样做

首先对inputString进行排序,然后删除最后对OutputString进行排序的代码行,如下所示:

string inputString = "xgdgyd";

inputString = string.Concat(inputString.OrderBy(c => c));

string OutputString = string.Empty;
int count = 1;
char[] charArr = inputString.ToCharArray();
for (int i = 0; i < charArr.Length; i++)
{
  for (int j = i + 1; j < charArr.Length; j++)
  {
    if (charArr[i] == charArr[j])
      count++;
  }
  if (!OutputString.Contains(charArr[i]))
    OutputString += charArr[i].ToString() + count.ToString();

  count = 1;
}
string inputString=“xgdgyd”;
inputString=string.Concat(inputString.OrderBy(c=>c));
string OutputString=string.Empty;
整数计数=1;
char[]charArr=inputString.ToCharArray();
for(int i=0;i
由于您可能还不了解LINQ,下面是一个使用“经典”技术的解决方案:

string input = "xgdgyd";
char[] charArr = input.ToCharArray();
Array.Sort(charArr); // Sort before counting as Gian Paolo suggests!
                     // ==> "ddggxy"
int count;
string output = "";
for (int i = 0; i < charArr.Length; i += count) { // Increment by count to get
                                                  // the next different char!
    count = 1;
    // Note that we can combine the conditions within the for-statement
    for (int j = i + 1; j < charArr.Length && charArr[j] == charArr[i]; j++) {
        count++;
    }
    output += charArr[i] + count.ToString();
}
Console.WriteLine(output); // ==> d2g2x1y1


更高级的技术是使用
StringBuilder
。请参见Jon Skeet。

因为您可能还不了解LINQ,这里有一个使用“经典”技术的解决方案:

string input = "xgdgyd";
char[] charArr = input.ToCharArray();
Array.Sort(charArr); // Sort before counting as Gian Paolo suggests!
                     // ==> "ddggxy"
int count;
string output = "";
for (int i = 0; i < charArr.Length; i += count) { // Increment by count to get
                                                  // the next different char!
    count = 1;
    // Note that we can combine the conditions within the for-statement
    for (int j = i + 1; j < charArr.Length && charArr[j] == charArr[i]; j++) {
        count++;
    }
    output += charArr[i] + count.ToString();
}
Console.WriteLine(output); // ==> d2g2x1y1



更高级的技术是使用
StringBuilder
。请参见Jon Skeet。

在开始构建结果之前,您应该计算所有字符的数量。我将开始对字符串进行排序,然后计算每个不同字符的出现次数。获取所需的字符串应该很容易。是否要区分大小写?听起来像是家庭作业?在开始构建结果之前,您应该计算所有字符。我将开始对字符串排序,然后计算每个不同字符的出现次数。获取您需要的字符串应该很容易。您想区分大小写吗?听起来像是家庭作业吗?我认为,正式来说,您应该在GroupBy之后执行OrderBy,因此在Select之后执行OrderBy。这应该适用于这些字符串值。@HenkHolterman是的,这将减少要排序的项的数量。这也是,但我不认为GroupBy承诺保留输入的顺序。总是喜欢看到长代码浓缩成优雅的Linq:)@HenkHolterman实际上,
GroupBy()
确实保留了顺序-:
分组中的元素是按照它们在源代码中出现的顺序生成的。
我认为,从形式上讲,您应该在GroupBy之后执行OrderBy,因此在Select之后。这应该适用于这些字符串值。@HenkHolterman是的,这将减少要排序的项的数量。这也是,但我不认为GroupBy承诺保留输入的顺序。总是喜欢看到长代码浓缩成优雅的Linq:)@HenkHolterman实际上,
GroupBy()
保留顺序-:
分组中的元素是按照它们在源代码中出现的顺序生成的。