2013-03-22 1 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 클래스는 문자열 변수가 엉망입니다.

어레이를 반복하여 모두 사전에 추가하는 빠르고 쉬운 방법이 있습니까?

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

있다 : 당신이 할 수 있도록

Dictionary<string,string> d = new Dictionary<...> 

for (int i=0; i<labels.Count; i++) { 
    d[labels[i]] = row[i]; 
} 
+0

하는 방법이 가능할 것이다 :

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

지금 당신이에서 사전을 만들 수 있습니까? 'row' 배열에있는 문자열의 순서에 대한 선험적 지식. 코드가 각 행을 추가 할 사전 항목을 어떻게 알 수 있습니까? (즉'row'의 어떤 인덱스가 어떤 키와 함께 움직일 것인가). 또한, 사전의 키는 어디에서 왔을까요? –

답변

1

그래 (비주얼 스튜디오없이 컴퓨터에, 그래서 내가 어떤 버그가있어 확인할 수 없습니다)

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

그리고 다시에 대한 가는이 (I = 0 int로 ; 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#은 반환 순서를 신경 쓰지 않습니다.

1
// you only have to do this once 
string[] labels = new string [] { "PRODUCTID", "PRODUCTCODE", ... 

다음은 사전을 가지고 그런 식으로로드 할 수 있습니다 이 로직을 단락시키지 않아도됩니다. 더 많은 메타 데이터를 행에 인코딩 할 수 없다면 어딘가에서 살아야합니다.

1

이 제품에 대한 오버로드 된 생성자에 그 논리를 넣어 :

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

참고 : 그것은 당신이 정적 배열의 모든 키를 정의하고 그래서 같이 루프를 사용할 수 말했다 . 모든 항목을 사전에 배치하면 잘못 입력 된 키 이름으로 인해 런타임 오류가 발생할 수 있습니다. 내가 < keys.Count,

1

배열에 키를 넣어 :

string[] row = productsList[i]; 

product.row1 = 
    Enumerable.Range(0, row.Length).ToDictionary(i => keys[i], i => row[i]); 
관련 문제