在C#列表中查找发生率最低的成员

时间:2016-11-08 20:28:39

标签: c# .net list

我有list<string>随机数量的条目(介于10-500之间)。我需要找到发生时间最少的值。例如,list<string> myList100 "a", 50 "b", 2 "c", and 1 "d",我希望提取“c”和“d”。我的问题是,我永远不会知道每个字符串的确切数量,以及列表中字符串的确切名称。

对于类似的类比,请检查以下代码:

public class Program
{
    public static void Main(string[] args)
    {
        Random r = new Random();                

        int randomNumber = r.Next(5,15);
        int randomRangeOne = r.Next(0,2);
        int randomRangeTwo = r.Next(0,2);

        List<int> randomList = new List<int>();

        for(int i = 0; i < 1000; i++)
        {
            int x = r.Next(randomNumber - randomRangeOne, randomNumber + randomRangeTwo);
            randomList.Add(x);
        }              
    }
}

在这种情况下(在实际问题中,它是随机字符串,而不是随机字符串),如何在列表中提取最少出现的值?

3 个答案:

答案 0 :(得分:7)

这是一个简单的LINQ

var leastOccured = data
    .GroupBy(x => x)
    .OrderBy(group => group.Count())
    .Select(x => x.Key)
    .First();

您对相同的字符串进行分组,按每组升序的数量对它们进行排序,并至少采用第一个字符串最少的字符串。

如果可以有多个具有相同出现次数的字符串,则可以使用下面的代码

var ordered = data
    .GroupBy(x => x)
    .Select(group => new { group.Key, Count = group.Count() })
    .OrderBy(x => x.Count);

var minOccurrenceCount = ordered.First().Count;

var leastOccurredStrings = ordered 
    .TakeWhile(x => x.Count == minOccurrenceCount)
    .Select(x => x.Key);

答案 1 :(得分:2)

如果您想获得所有具有最低计数的值,您可以分两步完成。

var lowestCount = stringList.GroupBy(x => x)
                            .Select(x => x.Count())
                            .Min();
var result = stringList.GroupBy(x => x)
                       .Where(x => x.Count() == lowestCount)
                       .Select(x => x.Key);

我使用以下作为输入数据:

var stringList = new List<string> { "a", "a", "a", "b", "b", "c", "c", "d","d" };

使用此输入result保持&#34; b&#34;,&#34; c&#34; &#34; d&#34;

答案 2 :(得分:1)

从逻辑上思考这些步骤,如果必须这样做,你将如何在现实生活中做到这一点?

  1. 浏览列表,在找到每个项目时在每个项目的框中加上一个标记。
  2. 完成后,对最小到最大的计数标记进行排序。
  3. 拿第一个盒子然后使用它。
  4. 您可以在程序中执行相同的操作。我觉得这是作业,所以我不会提供如何完成所有三个步骤的代码示例,但希望这会让你走上正确的轨道。