C#:计算列表中的倍数

时间:2015-04-06 15:31:12

标签: c# list enums count

所以我遇到的问题是我想要计算列表中枚举的倍数。比方说,我有一个“Hi”“Hi”“Hello”“Hi”和“Hello”的列表。

有没有一种方法可以搜索数组并发现有3个“Hi”而不必进行List.Where x =“Hi”>?

非常感谢。

7 个答案:

答案 0 :(得分:2)

您可以尝试使用Linq来计算频率,例如:

List<String> source = new List<string>() {
  "Hi", "Hi", "Hello", "Hi", "Hello"
};

Dictionary<String, int> freqs = source
  .GroupBy(item => item)
  .ToDictionary(item => item.Key,
                item => item.Count());

....
int freqHi = freqs["Hi"]; // 3

答案 1 :(得分:0)

要计算列表中某个元素的出现次数,您只需执行以下操作:

List.Count(x => x == "Hi");

编辑:如果您只是想要一个简单的方法来告诉N次出现哪个元素,您可以使用嵌套查询来实现:

List<string> greetings = new List<string> {"Hi", "Hi", "Hello", "Hello", "Hi"};

List<string> greetingsThatOccurThreeTimes = greetings
    .Where(s1 => greetings.Count(s2 => s1 == s2) == 3).ToList();

编辑#2 :您也可以使用扩展程序清理它。

宣布:

public static class ListExtensions
{
    public static List<T> WithNOccurrences<T>(this List<T> source, int n)
    {
        return source.Where(s1 => source.Count(s2 => s1.Equals(s2)) == n).ToList();
    } 
}

你可以在你的主叫代码中做这样的事情:

List<string> greetings = new List<string> {"Hi", "Hi", "Hello", "Hello", "Hi"};

// This list will only contain "Hi" (but 3 times, though)
List<string> greetingsThatOccurThreeTimes = greetings.WithNOccurrences(3);

这应该更像你的“ThreeOfAKind == true”。

如果您只想返回N次出现的每个项目之一,只需将.Distinct()添加到扩展方法,如下所示:

public static class ListExtensions
{
    public static List<T> WithNOccurrences<T>(this List<T> source, int n)
    {
        return source
            .Where(s1 => source.Count(s2 => s1.Equals(s2)) == n)
            .Distinct().ToList();
    } 
}

答案 2 :(得分:0)

此Linq查询将为您提供具有重复项的项目列表

 var mutiples = l.GroupBy(e => e).Where(c=>c.Count()>1);

你可以使用这段代码遍历mutiples列表

 foreach (var pair in mutiples)
            Console.WriteLine(pair.Key + " " + pair.Count());

答案 3 :(得分:0)

你走了:

        public List<string> GetDuplicates(List<string> list)
        {
            var q = from s in list
                    group s by s into g
                    select new { str = g.Key, count = g.Count() };

            return q.Where(str => str.count > 1).Select(str => str.str).ToList<string>();
        }

答案 4 :(得分:0)

string words = "Hi, Hi, Hello, Hi, Hello";
var countList = words.Split(new[] { " " }, StringSplitOptions.None);
int count = countList.Where(s => s.Contains("Hi")).Count();
运行此代码时

count = 3。

答案 5 :(得分:0)

您必须先将它们分组,然后执行选择操作。如果您要求计算它们,可以是一个例子:

List<string> stringList = new List<string>{ "hi", "hi", "hi", "hello" };
stringList.GroupBy(i => i).Select(i => new {i.Key, i.ToList().Count }).ToList();

答案 6 :(得分:0)

请参阅此SO帖子https://stackoverflow.com/a/10812657/1339616

您也可以使用这样的LINQ查询语法。

from    s in new List<string> {"Hi", "Hi", "Hello", "Hi", "Hello"}
group   s by s into g
where   g.Count() > 1
orderby g.Count() descending
select  new {Key = g.Key, Count = g.Count() }