C#在Foreach循环中显示字符串,其数量与选择的数量相同

问题描述 投票:1回答:4

所以我正在制造故障,我遇到了一个问题,就像我想要的那样显示数据。

这是我的代码(编辑只显示我的问题):

public string Formatsfunction(List<Metadata> mmds)
{
    Dictionary<string, int> formatNumber = new Dictionary<string, int>();

    foreach (Metadata mmd in mmds)
    {
        var type = mmd.Format.Type;
        var found = formatNumber.ContainsKey(type);

        if (found == true)
        {
            formatNumber[type]++;
        }
        else
        {
            formatNumber[type] = 1;
        }
    }

    Console.WriteLine();

    return null;
}

private string MeldingInformatie(string impact, string type, List<Metadata> mmds)
{
    var temp = Formatsfunction(mmds);
    var formats = mmds.Select(mmd => mmd.Format.Type +"("+temp+")");
    ...
}

我想要它做的是:

如果在Dictionary中有多个相同的类型,请将其写为:

狮子(3)熊(2)鱼(8)考拉(12)等

我想我已经有了一个良好的开端,但我不知道接下来该做什么。

c# list dictionary foreach containskey
4个回答
0
投票

你可能正在寻找这个:

返回null是非常无用的。您需要返回字典并使用它来格式化字符串。只需选择键(类型)并使用值格式化。使用string.Join将所有类型组合为一个字符串。

public Dictionary<string, int> Formatsfunction(List<Metadata> mmds)
{
    Dictionary<string, int> formatNumber = new Dictionary<string, int>();
    foreach (Metadata mmd in mmds)
    {
        var type = mmd.Format.Type;
        var found = formatNumber.ContainsKey(type);
        if (found == true)
        {
            formatNumber[type]++;

        }
        else
        {
            formatNumber[type] = 1;
        }
    }
    Console.WriteLine();

    return formatNumber;
}
private string MeldingInformatie(string impact, string type, List<Metadata> mmds)
{
    var temp = Formatsfunction(mmds);

    // (String interpolation is used)
    var formats = temp.Keys.Select(type => $"{type}({temp[type]})");

    return String.Join(" ", formats);

影响有什么作用?它可能无法解决所有问题,但可能会指向正确的方向。


0
投票

使用LINQ的GroupBy(),您可以编写整个方法,如:

public string Formatsfunction(List<Metadata> mmds)
{
    return string.Join(" ", 
               mmds.GroupBy(mmd => mmd.Format.Type, (type, g) => $"{type}({g.Count()})"));
}

它通过mmds属性对Format.Type中的元素进行分组,并创建一个包含Type(count)对的字符串。


0
投票

谢谢你的帮助!结合你们给我的所有知识,我解决了这个问题。对于那些感兴趣的人,答案是:

  public string Formatsfunction(List<Metadata> mmds)
    {
       Dictionary<string, int> formatNumber = new Dictionary<string, int>();
        foreach (Metadata mmd in mmds)
        {
            var type = mmd.Format.Type;
            var found = formatNumber.ContainsKey(type);
            if (found == true)
            {
                formatNumber[type]++;

            }
            else
            {
                formatNumber[type] = 1;
            }
        }
        var temp = formatNumber
            .OrderByDescending(p=>p.Value)
            .Select(mmd => mmd.Key +" ("+ mmd.Value+")");
        string keyvalues = string.Join(", ", temp);
        return keyvalues;
    }
    private string MeldingInformatie(string impact, string type, List<Metadata> mmds)
    {
        var temp = Formatsfunction(mmds);

        var formats = mmds.Select(mmd => mmd.Format.Type +"("+temp+")");
        var trackTrace = mmds.Select(mmd => mmd.TrackTrace);
        string messageTypes = string.Join(", ", formats);
     }

Output is now: Lion(8), Fish(7), Koala(6), Seagull(5), etc.

-1
投票

试试以下:

            Dictionary<string, int> formatNumber = new Dictionary<string, int>() {
                {"Lion",3},{"Bear",2},{ "Fish",8}, {"Koala", 12}};

            Console.WriteLine(string.Join(" ", formatNumber.AsEnumerable().Select(x => string.Format("{0}({1})", x.Key, x.Value)).ToList()));
© www.soinside.com 2019 - 2024. All rights reserved.