C# 如何基于整数字段获取列表中的项目?
我的程序中有一个列表,里面有我的自定义类。我希望能够从列表中提取一个对象,只需指定一个整数,然后将所有具有integer属性的对象返回到该整数。我想这样做: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
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。