2013-03-22 101 views
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類是一堆亂七八糟的字符串變量。

是否有一種快速無痛的方式來遍歷數組並將它們全部添加到字典中?

+0

這將如何可能呢?您的代碼作爲* priori *瞭解'row'數組中字符串的順序。代碼如何知道哪個字典條目將每行添加到? (換句話說,'row'中的哪個索引將使用什麼鍵)。另外,字典的關鍵字從哪裏來? – 2013-03-22 00:12:36

回答

1

燁(沒有Visual Studio的計算機上,所以我不能確認我有沒有bug)

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;我< keys.Count ; i ++) {[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#並不關心退貨訂單。

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

把這個邏輯到重載的構造函數的產品,所以你可以這樣做:

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

有沒有多少可以做到短路這種邏輯。除非您可以將更多元數據編碼到行中,否則它必須居住在某處。

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

但是請注意,這樣做這意味着你失去所有的靜態檢查的,你不必性能得到。通過將所有內容放入字典中,您將從錯誤鍵名稱中引入潛在的運行時錯誤。

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