C#使用LINQ的LIST循环

4

我在使用LINQ并将一个列表返回给我的业务逻辑层。我试图更改列表中的一个值(将“星级”评分更改为带有星号数量的图像)。

虽然计数器(i)似乎在工作,但FOR循环不正确。第一次停在正确的IF上,但随后就弹出ELSE语句,所有值最终都变成“star0.png”。似乎我没有遍历整个列表? 提前感谢!

    for (int i = 0; i < ReviewList.Count; i++)
    {
        string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC;
        if (serviceCode == "*")
        {
            ReviewList[i].SERVICE.SERVICE_DESC = "star1.png";
        }
        else if (serviceCode == "**")
        {
            ReviewList[i].SERVICE.SERVICE_DESC = "star2.png";
        }
        else if (serviceCode == "***")
        {
            ReviewList[i].SERVICE.SERVICE_DESC = "star3.png";
        }
        else if (serviceCode == "****")
        {
            ReviewList[i].SERVICE.SERVICE_DESC = "star4.png";
        }
        else
        {
            ReviewList[i].SERVICE.SERVICE_DESC = "star0.png";
        }
    }

你尝试过使用 foreach item in list 循环吗? - mcass20
1
循环看起来没问题。当你在调试器中逐步执行时会发生什么?serviceCode的值是什么? - StriplingWarrior
你确认了 ReviewList 的内容吗? - dlev
听起来可能是一个共享引用。 - Tejs
4个回答

3
如果所有的值都以 star0.png 结尾,那么你正在循环列表。每个元素只执行 else 语句表明存在逻辑错误 -- 也许你想要做类似下面这样的事情吗?
string serviceCode = ReviewList[i].SERVICE.SERVICE_CODE;

那也是我的反应... “所有值”意味着循环执行。 - Meta-Knight
我注意到你代码中唯一的区别是你用SERVICE.SERVICE_CODE替换了SERVICE.SERVICE_DESC。在我的表中,后者是一个整数,并且是该表中的标识值。 - Susan
@Susan 是的,我是在暗示你可能本意是放置 SERVICE_CODE,但却错误地放置了 SERVICE_DESC -- 不过根据你的评论,显然并非如此。如果你在 else 语句中添加一个断点,那么 serviceCode 的一些值是什么? - Donut
感谢您的帮助。如果您查看答案0,您会看到我最终是如何使其工作的,这部分是由于您的建议和上面的建议的结果。非常感谢! - Susan

2

我认为这不是for循环本身的问题...你的语法没问题,按照你写的会迭代ReviewList.Count次。

我建议先逐步检查并确认ReviewList的内容是否正确。

请告诉我你的发现。


所以这是我做的。(1)将serviceCode更改为整数,并且它比较的值是表的Identity值。因此,如果SERVICe_ID = 1,则REVIEWLIST[I].SERVICE.SERVICE_DESC = star1.png。它完美地工作。由于我能够在UI中提取SERVICE.SERVICE_DESC,我不明白为什么它在我的Bus Logic Layer中不起作用。有什么想法吗???哦好吧,谢谢帮助!!! - Susan
很难在没有完全查看代码的情况下做出判断...不过我从评论中了解到您已经解决了问题,这是一件好事 :) - quashBox

1
如果您知道每个项目将由若干颗星组成,为什么不这样做呢?
for (int i = 0; i < ReviewList.Count; i++)
{
    string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC;
    ReviewList[i].SERVICE.SERVICE_DESC = "star" + serviceCode.Length + ".png";
}

理论上这并没有完全考虑到else(尽管在实践中可能会)。 - dlev
你需要一些检查,确保字符串的每个元素都是 * 符号,并检查长度以确保不超过 4。 - Manatherin

0

双重检查锁定和else条件下的保护

for (int i = 0; i < ReviewList.Count; i++)
{
    string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC;
    if(!serviceCode.Contains(".png")) { // once name set should not be modified
      if(serviceCode.Contains("*")) 
         ReviewList[i].SERVICE.SERVICE_DESC = "star" + serviceCode.Length + ".png";
      else
         ReviewList[i].SERVICE.SERVICE_DESC = "star0.png";

   }
}

另一种LINQ方法

       ReviewList.ForEach(rs=>if(!rs.SERVICE.SERVICE_DESC.Contains(".png"))
{ rs.SERVICE.SERVICE_DESC = 
    "star" + rs.SERVICE.SERVICE_DESC.Length + ".png"});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接