首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表中的RemoveAll

列表中的RemoveAll
EN

Stack Overflow用户
提问于 2013-06-23 22:17:52
回答 2查看 233关注 0票数 0

在将内容添加到ListBox之前,我正在尝试从列表中删除几个符合特定条件的项。我希望从列表中删除(枚举)为"MediaState.Deleted“的任何内容。

到目前为止,我已经尝试过:

代码语言:javascript
复制
//does not remove anything
        dbAssetList.RemoveAll(x => x.MediaState.Equals(6));     

    //Error on .equals which states that "Cannot access static method equals in non-static context"
        dbAssetList.RemoveAll(x => x.MediaState.Equals(typeof(MediaState),MediaState.Deleted));     

    //Error on .equals which states that "Cannot access static method equals in non-static context"    
        dbAssetList.RemoveAll(x => dbAssetList.Contains(x.MediaState.Equals(typeof(MediaState), MediaState.Deleted)));

我做错了什么,如何删除列表中"MediaState.Deleted“的项目?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-23 22:28:14

代码的第一个变体不会删除任何内容,因为Equals将始终返回false

根据docs of that method,返回值为:

如果obj是与此实例具有相同类型和相同基础值的枚举值,则为

true;否则为false

如果将文字6传递给Equals,则不满足true的条件,即als 6的类型为int,而不是MediaState类型。

另外两个变体由编译器解析为static Equals method provided by System.Object (因为它是具有两个参数的最近的Equals方法)。编译器不会对此进行编译,因为您不会在System.Object上调用该静态方法,而是对其一个子类的类型引用进行编译。因为静态方法不是基于变量所指向的当前类型来解析的,而是在编译时解析的,所以这样的调用将不会编译。

相反,只需使用

代码语言:javascript
复制
listBox.Items.Add(dbAssetList.Where(x => x.MediaState != MediaState.Deleted));

用于比较的==运算符可以很好地处理C#中的枚举值。

票数 3
EN

Stack Overflow用户

发布于 2013-06-23 22:27:19

代码语言:javascript
复制
dbAssetList.RemoveAll(x => x.MediaState.Equals(MediaState.Deleted));

代码语言:javascript
复制
dbAssetList.RemoveAll(x => x.MediaState == MediaState.Deleted);

.Equals(6)不会匹配列表中的任何项。Equals的typeof()版本是静态的,不能在该上下文中使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17261627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档