更改类实例列表字典中类实例属性的值
本文关键字:实例 属性 列表 字典 | 更新日期: 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");