gpt4 book ai didi

c# - 在 foreach 循环中更新字典内容的问题

转载 作者:行者123 更新时间:2023-11-30 21:20:30 25 4
gpt4 key购买 nike

我正在为 IEnumerable 编写一个简单的通用更新扩展,此方法用于使用给定键连接给定的 2 个业务对象或字典列表并更新特定字段。

public static void Update<TOuter, TInner, TKey>(this IEnumerable<TOuter> outer, IEnumerable<TInner> Inner, Func<TOuter, TKey> OuterKeySelector, Func<TInner, TKey> InnerKeySelector,Action<TOuter,TInner> updator)
{
ILookup<TKey, TInner> innerLookup = Inner.ToLookup(InnerKeySelector, element => element);

foreach (TOuter outerItem in outer)
{
TKey key = OuterKeySelector(outerItem);
if (innerLookup.Contains(key))
{
foreach (TInner innerItem in innerLookup[key])
{
updator(outerItem, innerItem);
}
}
}

}

这在普通对象中工作正常,例如:

      List<testObject> obj1 = new List<testObject>()
{
new testObject(){fruitId=1,name="mango"},
new testObject(){fruitId=2,name="grapes"},
new testObject(){fruitId=2,name="grapes"},
new testObject(){fruitId=4,name="kivi"},
};

List<testObject> obj2 = new List<testObject>()
{
new testObject(){fruitId=2,name="apple"},
new testObject(){fruitId=4,name="orange"},
};

obj1.Update(obj2,
tx => tx.fruitId,
ty => ty.fruitId,
(tx,ty)=>tx.name=ty.name);

但是,我不能对字典使用这种方法,

       Dictionary<string, int> first = new Dictionary<string, int>()
{
{"a",1},
{"b",2},
{"c",9},
{"e",5},
};
Dictionary<string, int> second = new Dictionary<string, int>()
{
{"a",8},
{"b",2},
{"e",20}
};
var kk = 0;

first.Update(second,
f1 => f1.Key,
s1 => s1.Key,
(f1, s1) => f1.Value = s1.Value);

它给出了以下错误

Property or indexer 'System.Collections.Generic.KeyValuePair.Value' cannot be assigned to -- it is read only

我知道有一个限制,来自 MSDN

Enumerators can be used to read the data in the collection, but they cannot be used to modify the underlying collection.

是否有黑客/解决方法以通用方式实现相同的功能?

最佳答案

如果您以与 List 相同的方式查看代码,您的代码似乎是合理的至于Dictionary .

在您的列表示例中,您有一个 List<MyMutableType>然后你更新 Property列表中特定位置的 MyMutableType 对象。

在您的字典示例中,您有一个 Dictionary<Key,MyNotMutableType>并且您正在尝试替换 MyNotMutableType在某个位置的实例与另一个MyNotMutableType例如,您并不是要简单地更改 Property相同的对象实例。

按照用于 List 的方法,您应该有一个像这样的字典: Dictionary<Key,MyMutableType>在您的更新程序委托(delegate)中,您应该只更新 MyMutableType 的属性.

希望这对您有所帮助(抱歉我的英语不好)

关于c# - 在 foreach 循环中更新字典内容的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com