如何在'foreach'中减少相同的字符串

本文关键字:字符串 foreach | 更新日期: 2023-09-27 18:16:16

我是新编程的,有这个问题,我不能得到我想做的,这是我的代码

foreach(RunePage rune in runePages)
{
    if(rune.Slots != null && rune.Slots.Count > 0)
    {
        foreach(RuneSlot runeSlot in rune.Slots)
        {
            var runeName = staticApi.GetRune(RiotSharp.Region.lan, runeSlot.RuneId,    RuneData.tags, Language.es_ES).Name;
            richTextBox1.Text = runeName + "'n" + richTextBox1.Text;
        }
     }
     richTextBox1.Text = rune.Name + "'n" + richTextBox1.Text;
}
输出:

美联社

异能精粹

异能精粹

异能精粹

异能大雕文

魔抗强化雕文

异能大雕文

魔法穿透强雕文

魔法穿透强雕文

魔法穿透强雕文

魔法穿透强雕文

魔法穿透强雕文

魔法穿透强雕文

异能强印力量

异能强印力量

异能强印力量

大护甲印

大护甲印

大护甲印

大护甲印

大护甲印

大护甲印

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

强力穿透印记

我想要的是这样的输出

美联社

3x异能精粹异能

2倍异能强雕文

1x魔抗强化雕文

6倍魔法穿透强化雕文

3x强效异能圣印力量

6倍强化护甲封印

9倍强力穿透印记

我该怎么做?

如何在'foreach'中减少相同的字符串

我建议使用LINQ对它们进行分组和计数:

// TODO: Build up the whole string, and set the Text property once.
// Oh, and rename richTextBox1 to something more descriptive.
foreach (RunePage rune in runePages)
{
    if (rune.Slots != null)
    {
        var grouped = rune.Slots
             .GroupBy(slot => slot.RuneId)
             .Select(group => new { Name = staticApi.GetRune(RiotSharp.Region.lan, 
                                                             group.Key, RuneData.tags, 
                                                             Language.es_ES).Name),
                                    Count = group.Count() })
             .Select(pair => string.Format("{0}x {1}", pair.Count, pair.Name));
        richTextBox1.Text = string.Join("'n", grouped);
    }
    richTextBox1.Text = rune.Name + "'n" + richTextBox1.Text;
}

你可以使用一个简单的字典来代替LINQ,就像这样:

var runeTotals = new Dictionary<string, int>();
foreach(RuneSlot runeSlot in rune.Slots)
{
    var runeName = staticApi.GetRune(RiotSharp.Region.lan, runeSlot.RuneId, RuneData.tags, Language.es_ES).Name;
    if (runeTotals.ContainsKey(runeName))
    {
        runeTotals[runeName] += 1;
        continue;
    }
    runeTotals.Add(runeName, 1);
}
foreach (var runeTotal in runeTotals)
{
    richTextBox1.Text = runeTotal.Value + "x " + runeTotal.Key + "'n" + richTextBox1.Text;
}
如果条目被列出的次数多于它们被更改的次数,您可以保持字典全局,并在添加或删除条目时更新它。

您可以使用LINQ。如果您从未使用过它,它可能看起来很复杂,但它比使用更经典的字典和手动约简方法更简单。

public IEnumerable<String> GetRuneStrings()
{
    foreach(RunePage rune in runePages)
    {
        if(rune.Slots != null && rune.Slots.Count > 0)
        {
            foreach(RuneSlot runeSlot in rune.Slots)
            {
                var runeName = staticApi.GetRune(RiotSharp.Region.lan, runeSlot.RuneId,    RuneData.tags, Language.es_ES).Name;             
                yield return runeName;
            }
         }
         yield return rune.Name;
    }
}
public IEnumerable<String> GetAggregatedRuneStrings()
{
    return GetRuneStrings().
        GroupBy(runeStr => runeStr).
        Select(runeStrGroup => String.Format("{0} x {1}", runeStrGroup.First(), runStrGroup.Count()));
}

public void AddRuneStringsToRichTextBox()
{
    richTextBox1.Text += String.Join(Environment.NewLine, GetAggregatedRuneStrings().ToArray());
}