2016-11-13 107 views
-2
if (spanList.Count(p => p.ClassName == "p") == 2 && (spanList.Count(p => p.ClassName == "s") == 2)) 
{ 
    lesson.lesson2Name = spanList.Where(p => p.ClassName == "p").ToList()[1].TextContent; 
    lesson.lesson2Place = spanList.Where(p => p.ClassName == "s").ToList()[1].TextContent; 
    lesson.lesson2Tag = adressList.Where(p => p.ClassName == "n").ToList()[1].TextContent; 
    lesson.lesson2TagHref = adressList[1].GetAttribute("href"); 
} 
else if (spanList.Count(p => p.ClassName == "p") == 4 && (spanList.Count(p => p.ClassName == "s") == 2)) 
{ 
    lesson.lesson2Name = spanList.Where(p => p.ClassName == "p").ToList()[2].TextContent; 
    lesson.lesson2Place = spanList.Where(p => p.ClassName == "s").ToList()[1].TextContent; 
    lesson.lesson2Tag = spanList.Where(p => p.ClassName == "p").ToList()[3].TextContent; 
    lesson.lesson2TagHref = ""; 
} 

只有列表中的索引正在改變。我怎樣才能使這個簡單?如何簡化此代碼?

+1

你可以通過switch case語句來做到這一點,然後檢查是否ClassName =='p' || ClassName =='s',如果你不明白你的代碼,然後把它分解成更簡單的步驟。還詳細解釋了什麼問題和/或問題除了只是說裏面的列表正在改變 – MethodMan

+0

謝謝建議,檢查底部的代碼 – Niewidzialny

回答

1

從性能和可讀性的角度來看,這看起來很糟糕,因爲每當你想知道關於它的一些東西時,你就遍歷整個列表。

你應該嘗試像

List<YourObject> pList = spanList.Where(p => p.ClassName == "p").ToList(); 
List<YourObject> sList = spanList.Where(p => p.ClassName == "s").ToList(); 
if (pList.Count == 2 && sList.Count == 2) 
{ 
    lesson.lesson2Name = pList[1].TextContent; 
    lesson.lesson2Place = sList[1].TextContent; 
    lesson.lesson2Tag = adressList.Where(p => p.ClassName == "n").ToList()[1].TextContent; 
    lesson.lesson2TagHref = adressList[1].GetAttribute("href"); 
} 
else if (pList.Count == 4 && sList.Count == 2)) 
{ 
    lesson.lesson2Name = pList[2].TextContent; 
    lesson.lesson2Place = sList[1].TextContent; 
    lesson.lesson2Tag = pList.ToList()[3].TextContent; 
    lesson.lesson2TagHref = ""; 
} 
+0

並認爲我不能想出這個。 非常感謝,我不知道我是如何錯過它的。 另外,'你確定我們不能簡化它嗎? – Niewidzialny

+0

檢查底部的答案 – Niewidzialny

0
var pList = spanList.Where(p => p.ClassName == "p").ToList(); 
var sList = spanList.Where(p => p.ClassName == "s").ToList(); 

if(sList.Count == 2) 
{ 
    string name = ""; 
    string tag = ""; 
    string taghref = ""; 

    switch(pList.Count) 
    { 
     case 2: 
      name = pList[1].TextContent; 
      tag = adressList.Where(p => p.ClassName == "n").ToList()[1].TextContent; 
      taghref = adressList[1].GetAttribute("href"); 
      break; 
     case 4: 
      name = pList[2].TextContent; 
      tag = pList[3].TextContent; 
      break; 
     default: 
      name = "error"; 
      break; 
    } 

    lesson.lesson2Name = name; 
    lesson.lesson2Place = sList[1].TextContext; 
    lesson.lesson2Tag = tag; 
    lesson.lesson2TagHref = taghref; 
} 

@Crusha K. ROOL我用switch語句作爲MethodMan告訴,並得到這一點。它可以做得更好嗎?

+0

爲什麼你張貼這個答案當你應該更新你的原始問題與這張貼.. ..? – MethodMan

+2

如果可以避免的話,我通常不會成爲無用分配的粉絲。我只是把'string name'這個聲明放在那裏,沒有'=「」'部分。 switch語句中的每個case都會爲'name'賦值,以便永遠不會使用原始賦值。您可以通過簡單地將默認分配作爲相應情況的一部分添加到其他變量中,而不是過早地進行。但最終歸結爲個人偏好。 –

+0

@MethodMan抱歉從我的網站no-ogar,我正在做的第一步在stackoverflow。我會記住這一點。 感謝您的回覆。我會像你說的那樣編碼。 – Niewidzialny