【问题标题】:How do I get an item in a List<> based on an integer field?如何根据整数字段获取 List<> 中的项目?
【发布时间】:2010-10-13 05:40:15
【问题描述】:

我的程序中有一个 List,里面装满了我的自定义类。我希望能够通过简单地指定一个整数来从列表中提取一个对象,然后返回所有将整数属性设置为该整数的对象。我正在考虑这样做:

int exampleint = 5;
List<MyClass> extract = new List<MyClass>();
for(int i = 0; i < list.Length; i++) {
    if(list[i].Number == exampleint)
        extract.Add(list[i]);
}
return extract;

有没有更好或更快的方法来做到这一点?只是想知道。

更新:克里斯,你的回答有点不对劲。这个:

 List<MyClass> extract = list.FindAll(delegate(int obj) { return obj.Number == exampleint; });

实际上应该是这样的:

List<MyClass> extract = list.FindAll(new Predicate<MyClass>(delegate(MyClass obj) { return obj.Number == exampleint; }));

你的第一个例子给了我错误。但是感谢您为我指明了正确的方向,它现在似乎可以工作了。

【问题讨论】:

  • 你可以在这个项目中使用 Linq 吗?
  • 很高兴我能帮上忙。这很奇怪,因为一年多来我一直在使用和编译我建议的方式,没有出现任何问题。只是通过 Visual Studio 运行它,它没有抱怨。好吧,ReSharper 抱怨说,告诉我将其转换为 lambda,但它与委托版本编译得很好。
  • 我自己意识到的错误之一是“obj.Number”部分。 Int32 中没有名为 Number 的成员。
  • 配置器在回复我的评论时指出了这一点。我使用 lambdas 自动检测类型的第一个示例。第二个我没有测试就启动了,你是对的,它应该是一个 MyClass。我在下面更正了。

标签: c# generics list


【解决方案1】:
List<MyClass> extract = list.FindAll(obj => obj.Number == exampleint);

OR(如果您使用的是 .NET 2.0 并且不能使用表达式)

List<MyClass> extract = list.FindAll(delegate(MyClass obj) { return obj.Number == exampleint; });

【讨论】:

  • +!这比我的更优雅 :) 我总是忘记 FindAll。
  • 谢谢!我用的是2.0,应该是这么说吧。
  • 配置器是正确的。对于第一个示例,.NET 将自动检测类型,但第二个应该是 MyClass。
【解决方案2】:

如果你只有 C#2,试试这个:

public delegate bool Predicate<T>(T item);

public static IEnumerable<T> Where(IEnumerable<T> source, Predicate pred)
{
    foreach (T item in source)
    {
        if (pred(item))
            yield return item;
    }
}

只要有这种过滤要求,您就可以重复使用它,如下所示:

IEnumerable<MyClass> filtered = Where(list, delegate(MyClass c) { return c.Number == exampleint; });

它本质上与 Linq 解决方案相同,它可以让您在升级编译器时适应这种列表处理方式。

【讨论】:

    【解决方案3】:

    如果您使用的是 C# 3:

    return (from e in list
            where e.Number == exampleint
            select e).ToList();
    

    这将运行一个 LINQ 查询,将它们拉出,然后转换为列表。如果可以改为返回 IEnumerable,则可以避免 ToList() 调用。

    【讨论】:

      【解决方案4】:

      使用 Linq/扩展方法:

      var result = list.Where(x => x.PropertyValue == YourSelectedValue);
      

      【讨论】:

        【解决方案5】:

        如果你可以使用 Linq:

        列表提取 = existingList.Where(x => x.Number == exampleInt).ToList();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-06
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2016-05-29
          • 2017-02-23
          • 1970-01-01
          相关资源
          最近更新 更多