C# 一个LINQ表达式中的计数和不同计数

C# 一个LINQ表达式中的计数和不同计数,c#,.net,linq,c#-4.0,C#,.net,Linq,C# 4.0,是否有办法将2个linq表达式组合成一个?也就是说,一个LINQ表达式将把DistCount和NormCount返回到两个独立的int变量中 DistCount = (from string row in myList[i] where row.Length > 0 select row).Distinct().Count(); NormCount = (from string row in myList[i]

是否有办法将2个linq表达式组合成一个?也就是说,一个LINQ表达式将把DistCount和NormCount返回到两个独立的int变量中

DistCount = (from string row in myList[i]
                where row.Length > 0
                select row).Distinct().Count();

NormCount = (from string row in myList[i]
                where row.Length > 0
                select row).Count();

您可以尝试选择匿名类型:

from string row in myList[i] 
where row.Length > 0
select new { 
    DistCount = row.Distinct().Count(), 
    NormCount = row.Count() 
}

按行进行分组。然后您将得到不同的计数(#组数)和总数(
count
s之和)


来回答您的问题。没有内置的linq表达式

旁注。如果您确实需要它,可以创建一个

public static class Extensions
{
    public static Tuple<int, int> DistinctAndCount<T>(this IEnumerable<T> elements)
    {
        HashSet<T> hashSet = new HashSet<T>();
        int count = 0;
        foreach (var element in elements)
        {
            count++;
            hashSet.Add(element);
        }

        return new Tuple<int, int>(hashSet.Count, count);
    }
}
或者正如我个人更愿意写的那样:

   var distinctAndCount = myList[i].Where(row => row.Length > 0).DistinctAndCount();

var final=new{DistCount=1,NormCount=2}
row.Distinct().Count()将计算字符串行中的不同字符数,而不是作者所需的字符数。隐藏代码意图的代码将需要放入具有良好名称或注释的单独方法中。表现也是有问题的。记住在q的末尾有一个“ToList”,否则你会对整个小组做两次
   var distinctAndCount = (from string row in myList[i]
                              where row.Length > 0 
                              select row
                             ).DistinctAndCount();
   var distinctAndCount = myList[i].Where(row => row.Length > 0).DistinctAndCount();