所以我遇到的问题是我想要计算列表中枚举的倍数。比方说,我有一个“Hi”“Hi”“Hello”“Hi”和“Hello”的列表。
有没有一种方法可以搜索数组并发现有3个“Hi”而不必进行List.Where x =“Hi”>?
非常感谢。
答案 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() }