2016-11-13 108 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