【问题标题】:Show duplicates from lists c#显示列表中的重复项 c#
【发布时间】:2020-01-24 17:02:37
【问题描述】:

我正在开发一个 WPF 应用程序,在某一时刻,我必须从字符串列表中获取/显示所有重复项。 (带有重复的字符串名称和列表中相同字符串的数量)例如:“列表包含字符串 'Hello' 3 次。”到目前为止,我成功地获得了字符串的名称,但我无法获得它在列表中出现的正确次数。 到目前为止,这是我的代码:

List<String> answerData = new List<String>();

using (MySqlCommand command = new MySqlCommand(query2, conn))
                {
                    using (MySqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            answerData.Add(reader.GetString(0));
                        }
                    }
                }

var duplicates = answerData
                .GroupBy(i => i)
                .Where(g => g.Count() > 1)
                .Select(g => g.Key);

foreach (var d in duplicates)
{           
    MessageBox.Show(""+ d + duplicates.Count().ToString()); //Here I tried to get the number
    //with Count() but it doesn't work as I thought it would. 

}

我应该添加/更改什么以获得我想要的结果?

编辑

按照建议将我的代码更改为以下内容:

var duplicates = answerData
                .GroupBy(i => i)
                .Where(g => g.Count() > 1);

foreach (var d in duplicates)
{
  MessageBox.Show(d.Key + " " + d.Count().ToString());
}

现在它运行顺利。 谢谢大家!

【问题讨论】:

  • 您只是选择密钥作为返回。删除最后一个Select
  • .Select(g =&gt; g.Key) 您只选择了密钥。如果你想要计数,你应该得到它new {g.Key g.Count()}
  • .Select(g => new {key = g.Key, count = g.Count()}).ToList();

标签: c# wpf list linq


【解决方案1】:

duplicates 中存储实际组而不是键:

var duplicates = answerData
            .GroupBy(i => i)
            .Where(g => g.Count() > 1);

然后您可以遍历这些组:

foreach (var d in duplicates)
{           
    MessageBox.Show(d.Key + " " + d.Count().ToString());
}

此示例计算,即迭代,每个组两次。或者,您可以按照@HimBromBeere 的建议存储包含KeyCount 的对象。

【讨论】:

    【解决方案2】:

    您只需在Select 中返回号码:

    var duplicates = answerData
                .GroupBy(i => i)
                .Select(g => new { Key = g.Key, Count = x.Count() })
                .Where(x => x.Count > 1);
    

    请注意,我更改了您的语句顺序以避免重复执行 g.Count()

    【讨论】:

      【解决方案3】:

      你可以这样做 出于性能原因,您需要使用 Dictionary

                  List<String> answerData = new List<String>();
      
              Dictionary<string,int> map = new Dictionary<string, int>();
              foreach (var data in answerData)
              {
                  if (map.ContainsKey(data))
                  {
                      map[data]++;
                  }
                  else
                  {
                      map.Add(data, 1);
                  }
              }
      
              foreach (var item in map)
              {
                  if (item.Value > 1)
                  {
                      Console.WriteLine("{0} - {1}", item.Key, item.Value);
      
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多