【问题标题】: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?还有,如果这个元素存在,怎么知道是哪一个呢?

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

【问题讨论】:

    标签: c# list contains


    【解决方案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
          }
          

          【讨论】:

            猜你喜欢
            • 2020-07-05
            • 2015-12-19
            • 2022-06-25
            • 2014-11-30
            • 2018-02-09
            • 2019-04-30
            • 1970-01-01
            • 2020-06-18
            相关资源
            最近更新 更多