如何从数组中快速填充字典
本文关键字:填充 字典 数组 | 更新日期: 2023-09-27 18:05:07
我有一个对象,它有很多字符串变量,它们是从数组中填充的,这对我来说似乎效率很低,但这是我在短时间内计算的唯一方法,现在我有一点时间,我想通过使用字典来存储所有值来改进它。
这就是我现在拥有的:
Product product = new Product();
string[] row = productsList[i];
product.row1 = row;
product.PRODUCTID = row[0];
product.PRODUCTCODE = row[1];
product.PRODUCT = row[2];
product.CLEAN_URL = row[3];
product.WEIGHT = row[4];
product.LIST_PRICE = row[5];
product.DESCR = row[6];
product.FULLDESCR = row[7];
product.KEYWORDS = row[8];
product.TITLE_TAG = row[9];
product.META_KEYWORDS = row[10];
product.META_DESCRIPTION = row[11];
product.AVAIL = row[12];
product.RATING = row[13];
product.FORSALE = row[14];
product.SHIPPING_FREIGHT = row[15];
product.FREE_SHIPPING = row[16];
product.DISCOUNT_AVAIL = row[17];
product.MIN_AMOUNT = row[18];
product.LENGTH = row[19];
product.WIDTH = row[20];
product.HEIGHT = row[21];
product.LOW_AVAIL_LIMIT = row[22];
product.FREE_TAX = row[23];
product.CATEGORYID = row[24];
product.CATEGORY = row[25];
product.POS = row[26];
product.MEMBERSHIP = row[27];
product.PRICE = row[28];
product.THUMBNAIL = row[29];
product.IMAGE = row[30];
product.TAXES = row[31];
product.ADD_DATE = row[32];
product.VIEWS_STATS = row[33];
product.SALES_STATS = row[34];
product.DEL_STATS = row[35];
product.SMALL_ITEM = row[36];
product.SEPARATE_BOX = row[37];
product.ITEMS_PER_BOX = row[38];
product.GENERATE_THUMBNAIL = row[39];
product.RETURN_TIME = row[40];
product.MANUFACTURERID = row[41];
product.MANUFACTURER = row[42];
这真的很长很耗时,尤其是因为我最终必须把它读回来,而且我并不期待这样做,而且Products类是一堆字符串变量。
有没有一种快速而无痛的方法可以循环遍历数组并将它们全部添加到字典中?
是的(在没有visual studio的计算机上,所以我无法验证我没有错误(
List<string> keys = new List<string>{"PRODUCTID","PRODUCTCODE"'*ect*'}
Dictionary<string,string> dict = new Dictionary<string,string>
for (int i = 0; i < keys.Count; i++)
{
dict[keys[i]]=row[i];
}
然后回去for(int i=0;i<keys.Count;i++({row[i]=dict[keys[i]];}不过,这在功能上与您所拥有的没有任何不同,并且增加了一个限制,即您不能在编译时之前检查键。
您可以使用反射技巧,使用列表而不是字典自动填充属性:
http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx
for (int i = 0; i < keys.Count; i++)
{
this.GetType().InvokeMember(keys[i],
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, obj, row[i]);
}
只要你设置的是属性而不是成员,这一切都会发生。
不过,我仍然会手工列出属性列表,C#不在乎退货顺序。
// you only have to do this once
string[] labels = new string [] { "PRODUCTID", "PRODUCTCODE", ...
然后你就可以有一本字典,然后像这样加载:
Dictionary<string,string> d = new Dictionary<...>
for (int i=0; i<labels.Count; i++) {
d[labels[i]] = row[i];
}
将该逻辑放入Product的重载构造函数中,以便执行以下操作:
Product product = new Product(productsList[i]);
要使这个逻辑短路,你无能为力。它必须存在于某个地方,除非您能够将更多元数据编码到行中。
假设每个值都有一个唯一的键,那么在这里使用循环是不可能的。无论你怎么做,你都必须列出所有的钥匙。也就是说,你可以在一个静态数组中定义所有的键,并使用这样的循环:
string[] keys = new [] {"PRODUCTID", "PRODUCTCODE", ... };
Dictionary<string, string> ProductAttributes = new Dictionary<string,string>();
for(int i = 0, i < row.Length, i++)
{
ProductAttributes[keys[i]] = row[i];
}
但是,请注意,这样做意味着您将失去从拥有属性中获得的所有静态检查。通过将所有内容放在字典中,您引入了由于键入错误的密钥名称而导致的潜在运行时错误。
将密钥放入数组:
string[] keys = {
"PRODUCTID", "PRODUCTCODE", "PRODUCT", "CLEAN_URL",
"WEIGHT", "LIST_PRICE", "DESCR", "FULLDESCR",
"KEYWORDS", "TITLE_TAG", "META_KEYWORDS", "META_DESCRIPTION",
"AVAIL", "RATING", "FORSALE", "SHIPPING_FREIGHT",
"FREE_SHIPPING", "DISCOUNT_AVAIL", "MIN_AMOUNT", "LENGTH",
"WIDTH", "HEIGHT", "LOW_AVAIL_LIMIT", "FREE_TAX",
"CATEGORYID", "CATEGORY", "POS", "MEMBERSHIP",
"PRICE", "THUMBNAIL", "IMAGE", "TAXES",
"ADD_DATE", "VIEWS_STATS", "SALES_STATS", "DEL_STATS",
"SMALL_ITEM", "SEPARATE_BOX", "ITEMS_PER_BOX", "GENERATE_THUMBNAIL",
"RETURN_TIME", "MANUFACTURERID", "MANUFACTURER"
};
现在你可以用它制作一本词典:
string[] row = productsList[i];
product.row1 =
Enumerable.Range(0, row.Length).ToDictionary(i => keys[i], i => row[i]);