我正在爲IEnumerable編寫一個簡單的通用更新擴展,此方法用於連接給定的2列表業務對象或字典使用給定的鍵和更新特定的字段。更新在foreach循環中字典的內容
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);
它提供了以下錯誤
財產或索引器 'System.Coll ections.Generic.KeyValuePair.Value」 不能被分配到 - 它是隻讀 只
我知道是有限制的,通過MSDN
枚舉數可用於讀取數據 在集合中,但它們不能用於修改 基礎集合。
是否存在一種黑客/解決方法以通用方式實現相同的功能?
你試過第二[f1.Key] = S1 。值? – andyp 2010-07-16 09:53:08
@andyp,它的第一個[f1.Key] = s1.Value ..我也試過這個..但它給出了一個錯誤「集合被修改;枚舉操作可能無法執行。」 – RameshVel 2010-07-16 10:00:49
如果你真的想這樣做,你可以在你的擴展中編寫 'foreach(outer.ToList()中的TOuter outerItem)' – digEmAll 2010-07-16 10:21:50