0

我有一个包含许多字符串变量的对象,它们是从数组中填充的,这对我来说似乎效率很低,但这是我能在短时间内想到的唯一方法,现在我有一点时间想改进它通过使用字典来存储所有值。

这就是我现在所拥有的:

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 类是一堆字符串变量。

有没有一种快速而轻松的方法来循环遍历数组并将它们全部添加到 Dictionary 中?

4

5 回答 5

1
// 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];
}
于 2013-03-22T00:14:26.237 回答
1

将该逻辑放入 Product 的重载构造函数中,以便您可以执行以下操作:

Product product = new Product(productsList[i]);

你无能为力来短路这个逻辑。除非您可以将更多元数据编码到行中,否则它必须存在于某个地方。

于 2013-03-22T00:15:43.930 回答
1

鉴于每个值都有一个唯一的键,因此在此处使用循环并非易事。不管你怎么做,你都必须在某个地方列出所有的键。也就是说,您可以在静态数组中定义所有键并使用如下循环:

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];
}

但是请注意,这样做意味着您将失去从拥有属性中获得的所有静态检查。通过将所有内容都放在字典中,您会因键入错误的键名而引入潜在的运行时错误。

于 2013-03-22T00:16:07.973 回答
1

是的(在没有 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];
}

然后返回 (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# 并不关心退货单。

于 2013-03-22T00:30:56.660 回答
1

将键放入数组中:

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]);
于 2013-03-22T00:39:03.400 回答