C# 如何将这些LINQ语句重写为一个查询
是否可以使用一个LINQ查询执行相同的操作C# 如何将这些LINQ语句重写为一个查询,c#,linq,C#,Linq,是否可以使用一个LINQ查询执行相同的操作 var ints = new []{1,2,3,4,5}; var odd = from i in ints where i%2==1 select i; var even = from i in ints where i%2==0 select i; var q = from s in new[]{""} select new {oddCount = odd.Count(), evenCount = even.Count()}; Cons
var ints = new []{1,2,3,4,5};
var odd = from i in ints where i%2==1 select i;
var even = from i in ints where i%2==0 select i;
var q = from s in new[]{""}
select new {oddCount = odd.Count(), evenCount = even.Count()};
Console.Write(q);
编辑:要获取此
Count()
已允许您指定谓词。因此,您可以将上述内容组合到一个linq中,如下所示:
var ints = new[] { 1, 2, 3, 4, 5 };
Console.Write($"Odd={ints.Count(i => i % 2 == 1)}, Even={ints.Count(i => i % 2 == 0)}");
var q = ints.Select(i => new { Number = i, Type = (i % 2 == 0) ? "Even" : "Odd" }).GroupBy(i => i.Type).Select(g => new { Type = g.Key, Count = g.Count() });
var q = new { OddCount = ints.Count(i => i % 2 != 0), EvenCount = ints.Count(i => i % 2 == 0) };
还请注意,它比执行Where()
要快得多,因为计数比实际返回匹配元素更容易执行
编辑
如果您只需要一个linq查询,那么可以执行以下巧妙的操作:
var ints = new[] { 1, 2, 3, 4, 5 };
var Odd = ints.Count(i => i % 2 == 1);
Console.Write($"Odd={Odd}, Even={ints.Length - Odd}");
您只需将查询直接移动到select
var q = from s in new[] { "" }
select new {
oddCount = (from i in ints where i % 2 == 1 select i).Count(),
evenCount = (from i in ints where i % 2 == 0 select i).Count()};
您可以这样做一个查询:
var ints = new[] { 1, 2, 3, 4, 5 };
Console.Write($"Odd={ints.Count(i => i % 2 == 1)}, Even={ints.Count(i => i % 2 == 0)}");
var q = ints.Select(i => new { Number = i, Type = (i % 2 == 0) ? "Even" : "Odd" }).GroupBy(i => i.Type).Select(g => new { Type = g.Key, Count = g.Count() });
var q = new { OddCount = ints.Count(i => i % 2 != 0), EvenCount = ints.Count(i => i % 2 == 0) };
这将返回一个列表,其中包含“Type”和“Count”,如下所示
如果您正在寻找当前拥有的简单对象,可以使用以下更简单的方法:
var ints = new[] { 1, 2, 3, 4, 5 };
Console.Write($"Odd={ints.Count(i => i % 2 == 1)}, Even={ints.Count(i => i % 2 == 0)}");
var q = ints.Select(i => new { Number = i, Type = (i % 2 == 0) ? "Even" : "Odd" }).GroupBy(i => i.Type).Select(g => new { Type = g.Key, Count = g.Count() });
var q = new { OddCount = ints.Count(i => i % 2 != 0), EvenCount = ints.Count(i => i % 2 == 0) };
这将是一个具有“OddCount”和“EventCount”属性的单个对象
int odd = 0;
int even = 0;
(from s in ints
let evens = s % 2 == 0 ? even++ : even
let odds = s % 2 != 0 ? odd++ : odd
select true).ToList();
有了这个,你就有了偶数和奇数的值
这种方法的优点是只对数组进行一次迭代这里有另一种方法,只对原始列表进行一次迭代
var ints = new []{1,2,3,4,5};
string[] parities = { "even", "odd" };
var result = ints
.GroupBy(i => i % 2)
.Select(g => new { Name = parities[g.Key], Count = g.Count() });
听起来很适合: 印刷品
{ oddCount = 3, evenCount = 2 }
您可以使用
GroupBy
。对于q
,您甚至不使用s
,那么为什么不直接使用var q=new{oddCount=odd.Count(),evenCount=偶数.Count()代码>?另外,您对控制台的期望是什么代码>?为什么要将它们组合到一个查询中?使用Linq迭代一个静态的单元素集合,甚至不使用该集合,这感觉很奇怪。为什么在new[]{”“}…
中使用s的?这是在检索匿名类型的1项枚举。q.oddCount
甚至可以编译吗?@JohnBoker:你说得对。我更新了我的代码。我猜他试图(错误地)创建一个具有两个属性的匿名对象。从技术上讲,这仍然是两个Linq查询。@juharr:你也是对的。我添加了一个linq版本。两个不同方法的结果并不一致。固定的。