我有list<string>
随机数量的条目(介于10-500之间)。我需要找到发生时间最少的值。例如,list<string> myList
有100 "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);
}
}
}
在这种情况下(在实际问题中,它是随机字符串,而不是随机字符串),如何在列表中提取最少出现的值?
答案 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)
从逻辑上思考这些步骤,如果必须这样做,你将如何在现实生活中做到这一点?
您可以在程序中执行相同的操作。我觉得这是作业,所以我不会提供如何完成所有三个步骤的代码示例,但希望这会让你走上正确的轨道。