C# 如何基于整数字段获取列表中的项目?

C# 如何基于整数字段获取列表中的项目?,c#,generics,list,C#,Generics,List,我的程序中有一个列表,里面有我的自定义类。我希望能够从列表中提取一个对象,只需指定一个整数,然后将所有具有integer属性的对象返回到该整数。我想这样做: int exampleint = 5; List<MyClass> extract = new List<MyClass>(); for(int i = 0; i < list.Length; i++) { if(list[i].Number == exampleint) extract

我的程序中有一个列表,里面有我的自定义类。我希望能够从列表中提取一个对象,只需指定一个整数,然后将所有具有integer属性的对象返回到该整数。我想这样做:

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;
IEnumerable<MyClass> filtered = Where(list, delegate(MyClass c) { return c.Number == exampleint; });
有没有更好或更快的方法可以做到这一点?只是想知道

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

 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; }));
你的第一个例子给了我错误。但是谢谢你给我指出了正确的方向,它现在似乎起作用了。

如果你使用的是C3:

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

如果使用的是C3:


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

使用Linq/扩展方法:

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

使用Linq/扩展方法:

var result = list.Where(x => x.PropertyValue == YourSelectedValue);
如果可以使用Linq:

List extract=existingList.x=>x.Number==exampleInt.ToList

如果可以使用Linq:

List<MyClass> extract = list.FindAll(obj => obj.Number == exampleint);
List extract=existingList.x=>x.Number==exampleInt.ToList

List<MyClass> extract = list.FindAll(obj => obj.Number == exampleint);
或者如果您使用的是.NET 2.0,并且无法使用表达式

List<MyClass> extract = list.FindAll(delegate(MyClass obj) { return obj.Number == exampleint; });
或者如果您使用的是.NET 2.0,并且无法使用表达式

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

如果您只有C2,请尝试以下操作:

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;
    }
}
只要您有这种过滤需求,就可以重用它,如下所示:

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;
IEnumerable<MyClass> filtered = Where(list, delegate(MyClass c) { return c.Number == exampleint; });

它本质上与Linq解决方案相同,它将使您能够在升级编译器时使用这种类型的列表处理。

如果您只有C2,请尝试以下方法:

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;
    }
}
只要您有这种过滤需求,就可以重用它,如下所示:

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;
IEnumerable<MyClass> filtered = Where(list, delegate(MyClass c) { return c.Number == exampleint; });

它本质上与Linq解决方案相同,它将使您能够在升级编译器时使用这种类型的列表处理。

您能在本项目中使用Linq吗?很高兴我能提供帮助。这很奇怪,因为一年多以来我一直在使用和编译我建议的方法,没有遇到任何问题。只是通过VisualStudio运行了它,它没有抱怨。好吧,ReSharper抱怨说,告诉我将其转换为lambda,但它与委托版本编译得很好。我自己意识到的一个错误是obj.Number部分。Int32中没有名为Number的成员。configurator在回复我的评论时指出了这一点。我的第一个使用lambdas auto的示例检测类型。第二个我没有测试就发射了,你是对的,它应该是一个MyClass。我已经在下面更正了。你能在这个项目中使用Linq吗?很高兴我能帮忙。这很奇怪,因为一年多以来我一直在使用和编译我建议的方法,没有遇到任何问题。只是通过VisualStudio运行了它,它没有抱怨。好吧,ReSharper抱怨说,告诉我将其转换为lambda,但它与委托版本编译得很好。我自己意识到的一个错误是obj.Number部分。Int32中没有名为Number的成员。configurator在回复我的评论时指出了这一点。我的第一个使用lambdas auto的示例检测类型。第二个我没有测试就发射了,你是对的,它应该是一个MyClass。我已经在下面更正了它!这比我的更优雅:我总是忘记芬德尔。谢谢!我使用的是2.0,可能应该这么说。configurator是正确的。对于第一个示例,.NET将自动检测类型,但第二个应该是MyClass.+!这比我的更优雅:我总是忘记芬德尔。谢谢!我使用的是2.0,可能应该这么说。configurator是正确的。对于第一个示例,.NET将自动检测类型,但第二个示例应该是MyClass。