【问题标题】:Calculate Mode Using LINQ C#使用 LINQ C# 计算模式
【发布时间】:2018-11-29 14:45:19
【问题描述】:

我是使用 Linq 的新手,想知道如何打印出我的 Mode 值的多个值。目前我只能从模式中获得 1 个值,但我希望它显示多个值。

string[] list = TextBox1.Text.Split(new string[] { "," }, 
    StringSplitOptions.RemoveEmptyEntries);
int[] numbers = new int[list.Length];
for (int i = 0; i < numbers.Length; i++)
{
    numbers[i] = Convert.ToInt32(list[i].Trim());
}
int mode = numbers.GroupBy(v => v)
                  .OrderByDescending(g => g.Count())
                  .First()
                  .Key;

【问题讨论】:

  • 你使用First,所以你只得到一个。使用Select(g =&gt; g.Key) 然后循环结果
  • Select(g=&gt; g.Key) ?
  • 我知道这不是您问题的主要主题,但是如果您使用 string[] list = Textbox1.Text.split(',');??
  • Mode是最常出现的项目?

标签: c#


【解决方案1】:

您可以获取所有组并仅提取计数最高的组(包括平局):

var counts = numbers.GroupBy(v => v)
                    .Select(g => g.Key, Count = g.Count())
                    .OrderByDescending(g => g.Count);

var modes = numbers.Where(g => g.Count == counts.First().Count)
                   .Select(g => g.Key);

【讨论】:

  • 我会在哪里初始化 Count 变量?
  • @Swail 它在第一个查询的Select 中初始化。
【解决方案2】:

您需要先保存收藏,然后再拿走您想要的物品。

string[] list = TextBox1.Text.Split(new string[] { "," }, 
  StringSplitOptions.RemoveEmptyEntries);
IEnumerable<IGrouping<int, int>> modes = list.GroupBy(v => v);
IEnumerable<IGrouping<int, IGrouping<int, int>>> groupedModes = modes.GroupBy(v => v.Count());
var sortedGroupedModes = groupedModes.OrderByDescending(g => g.Key).ToList();

TextBox2.Text = string.Join(" ", sortedGroupedModes[0].Select(x => x.Key)));

【讨论】:

  • 出现错误:在实施更改时无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Colllctions.Generic.IEnumerable” .
  • 我已经纠正了错误,抱歉。如果您希望按顺序使用不同的模式值,则可以在 .SelectMany().ToList() 之间添加 .Distinct()
  • 感谢内森,你是明星!最后我希望将结果输出到文本框而不是控制台:TextBox2.Text = mode.ToString();。我该怎么办?
  • 我不确定您在文本框中需要它的格式,但如果您需要它,那么您的示例详细信息如何:TextBox2.Text = modes[0].ToString();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2020-02-16
相关资源
最近更新 更多