将LINQ转换为.NET 2.0

3

我应该如何在.NET 2.0中使用这个呢...?

[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<OperatorField> FindByType(String type)
{
    //  return only selected type
    return (from ce in this.OperatorFields where ce.Type == type select ce).ToList();
}

我在一个3.5项目中使用了这个,但现在我正在为一个旧项目添加新功能,但目前无法升级到3.5版本。


我刚刚做了这个:

[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<OperatorField> FindByType(String type)
{
    //  return only selected type
    //return (from ce in this.OperatorFields where ce.Type == type select ce).ToList();

    List<OperatorField> r = new List<OperatorField>();

    foreach (OperatorField f in this.OperatorFields)
        if (f.Type == type)
            r.Add(f);

    return r;
}

如果你看一下IL代码,真的有什么区别吗?你能测量两者的性能并查看哪个更快吗? - StingyJack
2分钟和4个相同的答案 :) - cwap
@StingyJack:IL代码将完全不同,因为Linq版本将调用System.Linq.Enumerable.Where()System.Linq.Enumerable.Select()System.Linq.Enumerable.ToList(),而另一个版本将调用IEnumerable.GetEnumerator()并迭代结果。 - R. Martinho Fernandes
4个回答

12

你是否仍然可以使用C# 3.0但不使用.NET 3.5?如果是这样,保持代码不变并使用 LINQBridge,它是为.NET 2.0实现的LINQ to Objects。

否则,请执行以下操作:

[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<OperatorField> FindByType(String type)
{
    List<OperatorField> list = new List<OperatorField>();
    foreach (OperatorField ce in OperatorFields)
    {
        if (ce.Type == type)
        {
            list.Add(ce);
        }
    }
    return list;
}

仅支持2.0版本 :( 直到下一个版本,这样我们才能告诉客户他们需要升级框架。我只是加入了我认为的一个解决方案。 - balexandre
5
你误解了我的意思。你可以使用Visual Studio 2008和C# 3.0的功能,但仍然面向.NET 2.0版本。为了实现这个目标,你不需要让客户升级框架。 - Jon Skeet
@balexandre:你是在使用VS 2008还是2005进行开发?Jon的建议使用LINQBridge可以让你在.Net 2.0上运行LINQ...但需要使用VS2k8附带的C#3编译器。所以如果你正在使用VS2k8进行开发,你可以轻松地保留代码并添加程序集。它将在.net 2.0上无缝运行。 - Robert Koritnik
在这种情况下,您可以使用C# 3 - lambda表达式、查询表达式等。使用LINQBridge,您可以保留原始代码。 - Jon Skeet
1
@Downvoter:能否解释一下你不喜欢这个答案的原因? - Jon Skeet

1

可能是这样的吗?

IList<OperatorField> col = new List<OperatorField>();
foreach (OperatorField f in this.OperatorFields)
{
    if (f.Type == type)
        col.Add(f);
}
return col;

1
[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<OperatorField> FindByType(String type)
{
    foreach (OperatorField ce in this.OperatorFields)
    {
        if (ce.Type == type)
            yield return ce;
    }
}

0

思考一下这个语句在做什么,它正在迭代 OperatorFields 属性中的每个项,检查类型,然后将该项添加到列表中,最后返回完整的列表。

所以你有

Create new list
For each item in OperatorFields
  if item.Type equals type
    add item to list

return list

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接