.net 有没有一种方法可以在C#中拥有一个< char,int>对的集合,两者都可以有重复的值?

bihw5rsg  于 2023-06-07  发布在  .NET
关注(0)|答案(3)|浏览(119)

我想找出给定字符串中一行中每个字符的计数。例如,“aabaccbb”有两个“a”,一个“b”,一个“a”,两个“c”和两个“b”。
我想有一个<char,int>对的集合,顺序对我来说很重要。例如上面这样的:{'a',2},' b ',1},' a ',1},' c ',2},' b ',2} }

  • “Dictionary<char,int>”不能有重复的键(char)。
  • “List< <KeyValuePair<char,int> >”很好,但是键和值是只读的,我需要修改它们。
  • “List<char,List>”也不合适,因为顺序对我来说很重要。

那我能做什么

efzxgjgh

efzxgjgh1#

我想你只是想做一个类来为你保存值然后做一个那种类型的列表

public class CharCount
{
    public char Char { get; set; }
    public int Count { get; set; }
}

然后创建一个列表

new List<CharCount>()
wsxa1bj1

wsxa1bj12#

您可以创建一个类

public class MyChar
{
    public char Char { get; set; }
    public int Num { get; set; }
}

像这样使用它。

string str = "aabaccbb";
        Dictionary<int, MyChar> pairs = new Dictionary<int, MyChar>();

        var chars = str.ToArray();
        int charNo = 0;
        for(int i = 0; i < chars.Length; i++)
        {
            int j = 1;
            while (i + j < chars.Length && chars[i + j] == chars[i])
                j++;

            pairs[charNo] = new MyChar { Char = chars[i], Num = j }; 
            i += j - 1;
            charNo++;
        }
zz2j4svz

zz2j4svz3#

使用IEnumerable<T>中的扩展方法来计算项目的运行次数,您可以将其转换为数组以获得项目和计数的有序集合:

var s = "aabaccbb";
var ans = s.CountRuns()
           .ToArray();

下面是扩展名:

public static class IEnumerableExt {
    public static IEnumerable<KeyValuePair<T, int>> CountRuns<T>(this IEnumerable<T> items, IEqualityComparer<T> cmp = null) {
        cmp = cmp ?? EqualityComparer<T>.Default;

        using (var itemsEnum = items.GetEnumerator()) {
            if (itemsEnum.MoveNext()) {
                var key = itemsEnum.Current;
                var count = 1;
                while (itemsEnum.MoveNext()) {
                    if (cmp.Equals(key, itemsEnum.Current))
                        ++count;
                    else {
                        yield return new KeyValuePair<T, int>(key, count);
                        key = itemsEnum.Current;
                        count = 1;
                    }
                }
                yield return new KeyValuePair<T, int>(key, count);
            }
        }
    }
}

相关问题