C# 如何将这些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

是否可以使用一个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()};

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版本。两个不同方法的结果并不一致。固定的。