Saeed_m_Farid
دوشنبه 05 تیر 1391, 14:10 عصر
سلام
دوستان، هر قسمتی تونستین به داد من برسین، پیشاپیش تقدیر به عمل میاد؛ البته خوب فقط سوال به ذهنم میاد و دنبال راه حل هستم، والا کارم گیر نیست...
یه اتفاق جالب امروز اتفاق افتاد واسه من، گفتم نظر شما رو هم بپرسم:
فرض کنید یه <Dictionary (http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)<string, string داریم که توش داده هامون هستن، حالا نیاز پیدا می کنیم که مثلاً Key هایی که اولشون xxx هست بکنیم yyy! خیلی سریع می فهمیم که اینکار ممکن نیست، چون :
Keys must be immutable as long as they are used as keys in the SortedDictionary(TKey, TValue). : 1 (http://msdn.microsoft.com/en-us/library/f7fta44c(v=vs.100).aspx)
پس مجبوریم اول آیتم های yyy درست و اضافه کنیم، بعد xxx ها رو حذف؛ حالا داستان اینجاست! جناب #C شروع میکنه به جفتک اندازی، چرا؟
اول خواستم یه Extension method بنویسم، نذاشت! برای جزئیات بیشتر، این تابع من هست:
public static void RenameKey(this Dictionary<string, string> dic,
string fromKey, string toKey)
{
string value = dic[fromKey];
dic.Remove(fromKey);
dic[toKey] = value;
}
این هم الطاف #C :
Extension method must be defined in a non-generic static class
خوب من که قرار نیست واسه یه کار کوچک، کل کلاس رو static کنم! ضمناً اصلاً هم تمایلی ندارم که کلاس من درآوردی واسه Dictionary بنویسم، بعدش مثلاً چنین Extension method ای توش داشته باشم، چون فردا برنامه برسه دست یکی دیگه، چه میدونه اینا چی هست؟ هرچقدر هم Document کنم، کیه که داکیومنت بخونه؟ public static RenameKey<TKey, TValue>(Dictionary<TKey, TValue> dic this,
TKey fromKey, TKey toKey)
{
TValue value = dic[fromKey];
dic.Remove(fromKey);
dic[toKey] = value;
}
پس کلاً این روش رو بیخیال شدم و عطایش رو به لقایش بخشیدیم ... (مگه اینکه از دوستان کسی کمک کنه!)
بعد دیدم، بابا من تو foreach اش هم مشکل دارم! وقتی یه Key عوض میکنی دیگه عملیات iteration برای اون شیء قابل اعمال نیست، یعنی درون foreach نمیشه چیزی که بعنوان iterate میدیم رو کم/زیاد کرد تغییر داد، بازهم کرامات #C:
Collection was modified; enumeration operation may not execute.>
خوب حالا باید چکار کنم؟ یه نمونه از Dictionary بسازم، اون رو تعییر بدم و در نهایت نتیجه رو به مقدار تعییر یافته انتساب بدم؛ جالب اینجاست که اینجا هم #C میره رو اعصاب! نمیشه از شیء موردنظر Clone کرد؛ یعنی چیزی بنام Clone که نداریم (یا من نمیدونم!) وقتی هم یه شیء انتساب بدی، میشه یه رفرنس به اصلیه، یعنی مثل Shortcut! واقعاً شما باشین چکار میکنین که یه ساعت بخاطر یه کار زپرتی الّاف بشین! پس بازم مجبور شدم از روشهای از سر وا کردن استفاده کنم:(
Dictionary<string, string> result = new Dictionary<string, string>();
result = result.Concat(info).ToDictionary(x => x.Key, x => x.Value);
آخرش شد یه آش شله قلم کار مثل این:
public void RepairInfo(ref Dictionary<string, string> info)
{
Dictionary<string, string> result = new Dictionary<string, string>();
result = result.Concat(info).ToDictionary(x => x.Key, x => x.Value);
foreach (string item in info.Keys)
{
if (item.Contains("XXXX"))
{
string key = System.Threading.Thread.CurrentThread.CurrentCultu re.TextInfo.ToTitleCase(
item.Replace("XXXX", "YYYY").Replace("_", " "));
result.Add(key, result[item]);
result.Remove(item);
}
}
info = result;
}
هرجای کار اگه اشتباه کردم، شاگرد هر کی که یه راهنمایی یا روشنگری بنماید، خواهیم شد...
ممنون
دوستان، هر قسمتی تونستین به داد من برسین، پیشاپیش تقدیر به عمل میاد؛ البته خوب فقط سوال به ذهنم میاد و دنبال راه حل هستم، والا کارم گیر نیست...
یه اتفاق جالب امروز اتفاق افتاد واسه من، گفتم نظر شما رو هم بپرسم:
فرض کنید یه <Dictionary (http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)<string, string داریم که توش داده هامون هستن، حالا نیاز پیدا می کنیم که مثلاً Key هایی که اولشون xxx هست بکنیم yyy! خیلی سریع می فهمیم که اینکار ممکن نیست، چون :
Keys must be immutable as long as they are used as keys in the SortedDictionary(TKey, TValue). : 1 (http://msdn.microsoft.com/en-us/library/f7fta44c(v=vs.100).aspx)
پس مجبوریم اول آیتم های yyy درست و اضافه کنیم، بعد xxx ها رو حذف؛ حالا داستان اینجاست! جناب #C شروع میکنه به جفتک اندازی، چرا؟
اول خواستم یه Extension method بنویسم، نذاشت! برای جزئیات بیشتر، این تابع من هست:
public static void RenameKey(this Dictionary<string, string> dic,
string fromKey, string toKey)
{
string value = dic[fromKey];
dic.Remove(fromKey);
dic[toKey] = value;
}
این هم الطاف #C :
Extension method must be defined in a non-generic static class
خوب من که قرار نیست واسه یه کار کوچک، کل کلاس رو static کنم! ضمناً اصلاً هم تمایلی ندارم که کلاس من درآوردی واسه Dictionary بنویسم، بعدش مثلاً چنین Extension method ای توش داشته باشم، چون فردا برنامه برسه دست یکی دیگه، چه میدونه اینا چی هست؟ هرچقدر هم Document کنم، کیه که داکیومنت بخونه؟ public static RenameKey<TKey, TValue>(Dictionary<TKey, TValue> dic this,
TKey fromKey, TKey toKey)
{
TValue value = dic[fromKey];
dic.Remove(fromKey);
dic[toKey] = value;
}
پس کلاً این روش رو بیخیال شدم و عطایش رو به لقایش بخشیدیم ... (مگه اینکه از دوستان کسی کمک کنه!)
بعد دیدم، بابا من تو foreach اش هم مشکل دارم! وقتی یه Key عوض میکنی دیگه عملیات iteration برای اون شیء قابل اعمال نیست، یعنی درون foreach نمیشه چیزی که بعنوان iterate میدیم رو کم/زیاد کرد تغییر داد، بازهم کرامات #C:
Collection was modified; enumeration operation may not execute.>
خوب حالا باید چکار کنم؟ یه نمونه از Dictionary بسازم، اون رو تعییر بدم و در نهایت نتیجه رو به مقدار تعییر یافته انتساب بدم؛ جالب اینجاست که اینجا هم #C میره رو اعصاب! نمیشه از شیء موردنظر Clone کرد؛ یعنی چیزی بنام Clone که نداریم (یا من نمیدونم!) وقتی هم یه شیء انتساب بدی، میشه یه رفرنس به اصلیه، یعنی مثل Shortcut! واقعاً شما باشین چکار میکنین که یه ساعت بخاطر یه کار زپرتی الّاف بشین! پس بازم مجبور شدم از روشهای از سر وا کردن استفاده کنم:(
Dictionary<string, string> result = new Dictionary<string, string>();
result = result.Concat(info).ToDictionary(x => x.Key, x => x.Value);
آخرش شد یه آش شله قلم کار مثل این:
public void RepairInfo(ref Dictionary<string, string> info)
{
Dictionary<string, string> result = new Dictionary<string, string>();
result = result.Concat(info).ToDictionary(x => x.Key, x => x.Value);
foreach (string item in info.Keys)
{
if (item.Contains("XXXX"))
{
string key = System.Threading.Thread.CurrentThread.CurrentCultu re.TextInfo.ToTitleCase(
item.Replace("XXXX", "YYYY").Replace("_", " "));
result.Add(key, result[item]);
result.Remove(item);
}
}
info = result;
}
هرجای کار اگه اشتباه کردم، شاگرد هر کی که یه راهنمایی یا روشنگری بنماید، خواهیم شد...
ممنون