这可能听起来很蹩脚,但我还没有找到一个非常好的解释Aggregate.
良好意味着简短,描述性,全面,有一个小而明确的例子.
我在动态LINQ 的VS2008示例中找到了一个示例,它允许您使用类似sql的字符串(例如,OrderBy("Name, Age DESC"))用于排序.不幸的是,包含的方法仅适用于IQueryable<T>;.有没有办法获得此功能IEnumerable<T>?
我对枚举器如何工作以及LINQ有些怀疑.考虑这两个简单的选择:
List<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
要么
IEnumerable<Animal> sel = (from animal in Animals
join race in Species
on animal.SpeciesKey equals race.SpeciesKey
select animal).Distinct();
Run Code Online (Sandbox Code Playgroud)
我更改了原始对象的名称,因此这看起来像一个更通用的示例.查询本身并不重要.我想问的是:
foreach (Animal animal in sel) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我使用IEnumerable,当我调试并检查"sel"时,在这种情况下是IEnumerable,它有一些有趣的成员:"inner","outer","innerKeySelector"和"outerKeySelector",这些最后2个出现成为代表."内部"成员中没有"Animal"实例,而是"Species"实例,这对我来说非常奇怪."外部"成员确实包含"Animal"实例.我假设两位代表确定哪些进入,哪些进出?
我注意到如果我使用"Distinct","inner"包含6个项目(这是不正确的,因为只有2个是Distinct),但"outer"确实包含正确的值.同样,委托方法可能决定了这一点,但这比我对IEnumerable的了解要多一些.
最重要的是,两种选择中的哪一种是性能最佳的?
邪恶的名单转换通过.ToList()?
或者直接使用枚举器?
如果可以,请解释一下或抛出一些解释IEnumerable使用的链接.
假设我有LINQ查询,例如:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Run Code Online (Sandbox Code Playgroud)
鉴于它authorsList是类型List<Author>,我如何删除查询返回的Author元素?authorsListauthors
或者换句话说,如何删除所有名字等于Bob的名字authorsList?
注意:这是用于问题目的的简化示例.
在System.Linq命名空间,我们现在可以扩展我们IEnumerable的有Any()和Count() 扩展方法.
最近我被告知如果我想检查一个集合中是否包含一个或多个项目,我应该使用.Any()扩展方法而不是.Count() > 0扩展方法,因为.Count()扩展方法必须迭代所有项目.
其次,一些集合具有属性(未扩展方法),其是Count或Length.使用它们会更好吗,而不是.Any()或.Count()?
是啊/是?
是否有任何简单的LINQ表达式将我的整个List<string>集合项连接到string具有分隔符的单个?
如果集合是自定义对象而不是string?想象一下,我需要连接object.Name.
如何在不使用join-on-equals-into子句的情况下在C#LINQ中对对象执行左外连接?有没有办法用where条款做到这一点?正确的问题:对于内连接很容易,我有这样的解决方案
List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
select new JoinPair { LeftId = l.Id, RightId = r.Id})
Run Code Online (Sandbox Code Playgroud)
但对于左外连接我需要一个解决方案.我是这样的,但它不起作用
List< JoinPair> leftFinal = (from l in lefts from r in rights
select new JoinPair {
LeftId = l.Id,
RightId = ((l.Key==r.Key) ? r.Id : 0
})
Run Code Online (Sandbox Code Playgroud)
JoinPair是一个类:
public class JoinPair { long leftId; long rightId; }
Run Code Online (Sandbox Code Playgroud) 通过lambda表达式传入时,是否有更好的方法来获取属性名称?这是我现在拥有的.
例如.
GetSortingInfo<User>(u => u.UserId);
Run Code Online (Sandbox Code Playgroud)
只有当属性是字符串时,它才能将其作为元素表达式进行处理.因为不是所有属性都是字符串我必须使用对象,但它会返回一个单一表达式.
public static RouteValueDictionary GetInfo<T>(this HtmlHelper html,
Expression<Func<T, object>> action) where T : class
{
var expression = GetMemberInfo(action);
string name = expression.Member.Name;
return GetInfo(html, name);
}
private static MemberExpression GetMemberInfo(Expression method)
{
LambdaExpression lambda = method as LambdaExpression;
if (lambda == null)
throw new ArgumentNullException("method");
MemberExpression memberExpr = null;
if (lambda.Body.NodeType == ExpressionType.Convert)
{
memberExpr =
((UnaryExpression)lambda.Body).Operand as MemberExpression;
}
else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpr = lambda.Body as MemberExpression;
}
if (memberExpr …Run Code Online (Sandbox Code Playgroud) 我经常遇到我想在我声明它的地方评估查询的情况.这通常是因为我需要多次迭代它并且计算起来很昂贵.例如:
string raw = "...";
var lines = (from l in raw.Split('\n')
let ll = l.Trim()
where !string.IsNullOrEmpty(ll)
select ll).ToList();
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果我不打算修改结果,那么我不妨打电话给ToArray()而不是ToList().
我想知道是否ToArray()通过第一次调用实现,ToList()因此内存效率低于仅调用ToList().
我疯了吗?我应该只是打电话ToArray()- 安全且安全地知道内存不会被分配两次吗?
考虑IEnumerable扩展方法SingleOrDefault()和FirstOrDefault()
返回序列的唯一元素,如果序列为空,则返回默认值; 如果序列中有多个元素,则此方法抛出异常.
而FirstOrDefault从MSDN(推测当使用OrderBy()或 OrderByDescending()或根本没有),
返回序列的第一个元素
考虑一些示例查询,并不总是清楚何时使用这两种方法:
var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE
var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?
var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?
Run Code Online (Sandbox Code Playgroud)
题
你遵循或暗示什么约定决定要使用时SingleOrDefault(),并FirstOrDefault()在您的LINQ查询?
linq ×10
c# ×7
.net ×5
.net-3.5 ×2
list ×2
performance ×2
ienumerable ×1
join ×1
lambda ×1
linq-to-sql ×1