1

所以我正在制作一个邮件功能,但我在以我希望的方式显示数据时遇到问题。

这是我的代码(编辑为仅显示我遇到的问题):

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) 等

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

4

4 回答 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);

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

于 2017-12-19T14:59:14.427 回答
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.
于 2017-12-19T15:40:26.527 回答
0

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

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

这将元素mmdsFormat.Type属性分组,并创建一个包含Type(count)对的字符串。

于 2017-12-19T15:04:50.697 回答
-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()));
于 2017-12-19T14:53:18.430 回答