如何检查 List<T> 元素是不是包含具有特定属性值的项目

Posted

技术标签:

【中文标题】如何检查 List<T> 元素是不是包含具有特定属性值的项目【英文标题】:how to check if List<T> element contains an item with a Particular Property Value如何检查 List<T> 元素是否包含具有特定属性值的项目 【发布时间】:2011-06-23 15:36:54 【问题描述】:
public class PricePublicModel

    public PricePublicModel()  

    public int PriceGroupID  get; set; 
    public double Size  get; set; 
    public double Size2  get; set; 
    public int[] PrintType  get; set; 
    public double[] Price  get; set; 


List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

如何检查pricePublicList 的元素是否包含特定值。更准确地说,我想检查是否存在pricePublicModel.Size == 200?还有,如果这个元素存在,怎么知道是哪一个呢?

编辑如果字典更适合这个,那么我可以使用字典,但我需要知道如何:)

【问题讨论】:

【参考方案1】:

如果您有一个列表,并且您想知道在列表中的哪个位置存在与给定条件匹配的元素,您可以使用FindIndex 实例方法。比如

int index = list.FindIndex(f => f.Bar == 17);

其中f =&gt; f.Bar == 17 是具有匹配条件的谓词。

在你的情况下,你可以写

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 

    // element exists, do what you need

【讨论】:

如果我不知道该值的属性怎么办?例如我有一个显示“18.00”的列表项,我不知道它来自哪里,所以我想检查一下哪个属性有这个值?所以基本上,和这个例子类似,我没有我想弄清楚的 .size 或 .bar 如果项目不存在怎么办:索引值是多少? 注意: 如果元素不存在,findIndex 将返回 –1。文档:msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx @tomloprod 这就是他检查索引是否大于或等于零的原因。如果(索引> = 0)。也可以把它写成 (index > -1)。【参考方案2】:
bool contains = pricePublicList.Any(p => p.Size == 200);

【讨论】:

这个严格来说是看是否存在。 这并不能真正回答问题。他说,how to know which one is it 可能无法回答他的问题,但它确实对我有所帮助,因为我需要查看我的集合中是否已经存在具有给定名称的对象。我期待一个改进的 .Contains-method - 这正是这个 LINQ 表达式所做的。谢谢。 它回答了title中的问题。 OP 在他的描述中解释说,他并不真正想要他所说的他想要的东西。尽管如此,他中的一个,以及我们数十人通过谷歌找到了这个问题。我认为更重要的是我们能够找到他标题问题的真正答案。 如果有人尝试此操作并且 .Any() 无法识别,则需要在文件顶部添加 using System.Linq;【参考方案3】:

你可以使用存在

if (pricePublicList.Exists(x => x.Size == 200))

   //code

【讨论】:

【参考方案4】:

使用 LINQ 很容易做到这一点:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)

    // Element doesn't exist

【讨论】:

是否可以直接编辑符合此条件的元素?不是获取它并存储在新对象中,而是直接更改? 可以修改返回的match 值(它是列表中的PricePublicModel 对象)。 您不应该直接修改可以为空的对象。您总是可以这样做:match.Size = 300;foreach(var item in pricePublicList.Where(p =&gt; p.Size == 200)) item.Size = 300;。不过,我自己不会将它用作单线。【参考方案5】:

您实际上并不需要 LINQ,因为 List&lt;T&gt; 提供了一种完全符合您要求的方法:Find

搜索与指定谓词定义的条件匹配的元素,并返回整个List&lt;T&gt; 中的第一个匹配项。

示例代码:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);

【讨论】:

【参考方案6】:
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) 
   // There exists one with size 200 and is stored in item now

else 
  // There is no PricePublicModel with size 200

【讨论】:

【参考方案7】:

你也可以只用List.Find():

if(pricePublicList.Find(item => item.Size == 200) != null)

    // Item exists, do something

else

    // Item does not exist, do something else

【讨论】:

以上是关于如何检查 List<T> 元素是不是包含具有特定属性值的项目的主要内容,如果未能解决你的问题,请参考以下文章

检查 list<t> 是不是包含任何其他列表

检查 list<t> 是不是包含任何其他列表

List<T> 任何或计数? [复制]

如何在 List<T> 中找到特定元素?

如何将项目添加到 List<T> 的开头?

如何理解 Java 中的 lt;T extends Comparable<