更改类实例列表字典中类实例属性的值

本文关键字:实例 属性 列表 字典 | 更新日期: 2023-09-27 17:55:58

我有一个类型为Dictionary<int, List<MyType>>的变量,其中MyType是一个具有多个属性和方法的类。我只显示两个属性,没有方法,因为它们与问题无关。

class MyType
{
    private string property1;
    private double property2;
    public string Property1
    {
        get { return property1; }
        set { property1 = value; }
    }
    public double Property2
    {
        get { return property2; }
        set { property2 = value; }
    }

我想遍历字典并找到类实例的属性(例如 Property2)具有特定值的所有类实例。

有了这个,我想修改属性的值并执行其他计算。

我一直在寻找如何做到这一点,但似乎找不到任何有帮助的东西。我已经查看了.ToLookup()方法,但我不确定在这种情况下如何使用它。任何帮助将不胜感激。

更改类实例列表字典中类实例属性的值

可以使用两个 foreach 循环和 LINQ .Where 扩展方法:

using System.Linq;
// ...
foreach (KeyValuePair<int, List<MyType>> kv in dict)
{
    foreach (MyType t in kv.Value.Where(v => v.Property2 == 2.0))
    {
        // Use t for further calculations
    }
}

如果需要无 LINQ 解决方案,可以在内部循环中使用 if 语句:

foreach (KeyValuePair<int, List<MyType>> kv in dict)
{
    foreach (MyType t in kv.Value)
    {
        if (t.Property2 != 2.0) continue;
        // Use t for further calculations
    }
}

要遍历字典,请使用KeyValuePair<TKey,TValue>类。 由于您有一个列表作为您的值,因此您需要在字典的迭代中嵌套一个循环。 下面是一个假设myDictionary Dictionary<int, List<MyType>>的示例:

foreach(var keypair in myDictionary)
{
     foreach(MyClass m in keypair.Value.Where(v => v.Property1.Equals("something"))
     {
          //do whatever you want here with m being an object in the list of MyClass
     }
 }

LINQ Where 语句采用 lambda,只要 lambda 返回 true,这些对象将成为列表迭代的一部分。

如果您只想从内部列表中获得IEnumerable<MyClass>并且不关心密钥,则可以这样做:

var iterableMyClass = myDictionary.SelectMany(kv => kv.Value)
                                  .Where(v => v.Property2.Equals("something"));

现在,iterableMyClass是一个IEnumerable<MyClass>对象,它合并了字典中的所有列表。 这是因为SelectMany用于"展平"多个集合。 Where 操作还以与我的第一个示例中的 foreach 循环相同的方式筛选返回的IEnumerable

使用此单个 IEnumerable,您可以使用一个简单的foreach(MyClass m in iterableMyClass)来循环访问所有匹配的对象。

编辑

根据我们下面的讨论,如果您需要获取计数或判断 IEnumerable 是否至少包含一个项目,您可以执行以下任一操作。

要获取匹配计数,您只需在 IEnumerable 对象上调用 .Count(),但如果您实际上根本不需要这些对象,您可以这样做:

var count = myDictionary.SelectMany(kv => kv.Value).Count(v => v.Property2.Equals("something");

要获取布尔值,确定是否至少有一个匹配项,但不需要匹配的对象,请执行以下操作:

bool atLeastOne = myDictionary.SelectMany(kv => kv.Value).Any(v => v.Property2.Equals("something");