2015-06-19 117 views
-2

我有一个项目,我不能使用System.Linq,所以我正在尝试创建一个切割方法,其工作方式与linq完全相同,我该怎么做?自定义方法

var x = y.ToList().Where(t => t.Title != "Foo"); 

SOLUTION 1

protected void Page_Load(object sender, EventArgs e) 
{ 
    var x = y.ToList().Where<Microsoft.SharePoint.Navigation.SPNavigationNode>(x => x.Title != "Foo"); 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> filter) 
    { 
     foreach (var item in source) 
     { 
      if (filter(item)) 
       yield return item; 
     } 
    } 
} 

注:.NET 2.0版

+3

http://codeblog.jonskeet.uk/category/edulinq/ –

+4

你有什么试过的? [源代码](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs)可能是一个很好的开始的地方 – Sayse

+0

在Where之前没有ToList的要点。 – Andrew

回答

1

写一个循环,决定了你的结果

List<YourObject> List = new List<YourObject>(); 
List<YourObject> Result = new List<YourObject>(); 
for (int i = 0; i < List.Count; i++) 
{ 
    if (List[i].Title != "Foo") 
     Result.Add(List[i]); 
} 
+1

对 - 但在这种情况下,它似乎符合他的需求 – fubo

+0

是的,它很可能会。但问题确实会说“完全相同”,所以我认为它至少值得评论。这不是“这是一个错误的答案”类型的评论,只是“这是一个额外的笔记”类型的评论。这可能有点简洁,但在这种情况下,我很抱歉可能造成的任何误解。 – Chris

3

这里是一个扩展方法:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> filter) 
{ 
    foreach (var item in source) 
    { 
     if (filter(item)) 
      yield return item; 
    } 
} 
+2

@Sayse我没有阅读过你提到的博客,但是关于我唯一会做的与此不同的事情(的确有几个答案的一部分,还有我的pre-linq代码,因为它定义了一个委托,因为'Func '还不存在)是将'filter'重命名为'predicate'。 (如果它是在自己的程序集之外使用,那么在传递给一个单独的私有方法之前,我会有空的检查)。这段代码是很明显的实现。 –

+0

如果他们没有Linq,但他们确实有lambda,他们大概使用.NET 3.0。你必须添加'public delegate TResult Func (T arg);'定义'Func',以便可以使用它。 –

+1

他们使用.NET v2.0,所以我猜Func也行不通? – Mert