如果List <struct>中的值等于给定值</struct>,则设置bool

时间:2015-03-04 04:14:26

标签: c# .net struct

以下代码将根据 sList 中的最后商品ID 返回true或false。我超越了这一点,我想知道的是,如果有人sList[i].getID = 1那么它会设置bool value = true,但是如果sList[i].getID = 0下的所有值那么它会设置bool value = false。我觉得这是一个简单的答案,但我的大脑现在感觉很阴沉。

public Class Data 
{
     public struct Struct
     {
         public Struct(string s, bool b, Vector2 v, int i) 
             : this() 
          {
              this.text = s;
              this.tf = b;
              this.ID = i
              this.seg = v;
          }

         private String text { get; set; }
         public String getText { get { return text; } }
         private bool tf { get; set }
         public bool getTF { get { return tf; } }
         private Vector2 seg { get; set; }
         public Vector2 getSeg { get { return seg; } }
         private int ID { get; set; }
         public int getID { get { return ID; } }
     }
}

其他一些课程:

List<Data.Struct> sList = new List<Class.Struct>();
bool value = false;

sList.Add(new Data.Struct("Hello", false, new Vector2(150, 150), 0));
sList.Add(new Data.Struct("Cruel", true, new Vector2(150, 150), 1));
sList.Add(new Data.Struct("World", true, new Vector2(150, 150), 0));

for(int i = 0; i < sList.Count; i++)
{
     if(sList[i].getID == 1)
     {
          value = true;
     } 
     else if(sList[i].getID == 0)
     {
          value = false;
     }
}

4 个答案:

答案 0 :(得分:2)

使用for循环,您需要先将标记设置为false,然后仅在遇到true时将其设置为1。目前,您在每次通过时都会覆盖您的价值。

value = false;
for (int i = 0; i < sList.Count; i++)
{
    if (sList[i].getID == 1)
    {
        value = true;
    }
}

这样,一旦设置为true,即使以下任何值为0,它也不会重置为false。< / p>

您还可以在break之后使用true语句来缩短循环的执行时间。由于您确实没有大量数据,因此它非常符合您的喜好。


作为更清洁的替代方案,您可以使用LINQ&#39; Any

bool value = sList.Any(s => s.getID == 1);

这就像读取的那样,如果列表中的任何值的ID等于1,它将返回true

您还可以使用不太干净的负面All

bool value = !sList.All(s => s.getID == 0);

那是反过来的,不太明显。

答案 1 :(得分:1)

List<Data.Struct> sList = new List<Class.Struct>();

sList.Add(new Data.Struct("Hello", false, new Vector2(150, 150), 0));
sList.Add(new Data.Struct("Cruel", true, new Vector2(150, 150), 1));
sList.Add(new Data.Struct("World", true, new Vector2(150, 150), 0));

bool value = sList.Any(s => s.getID == 1);

您可能需要在文件顶部添加using指令才能生效。

如果由于某种原因无法使用Any()方法,请执行以下操作:

List<Data.Struct> sList = new List<Class.Struct>();

sList.Add(new Data.Struct("Hello", false, new Vector2(150, 150), 0));
sList.Add(new Data.Struct("Cruel", true, new Vector2(150, 150), 1));
sList.Add(new Data.Struct("World", true, new Vector2(150, 150), 0));

bool value = false;
foreach(var s in sList) 
{ 
    if (s.getId == 1) 
    {
       value = true;  
       break;
    }
}

答案 2 :(得分:0)

当你得到true时你应该打破循环,如果你在循环后得到真值,那意味着至少有一个getID == 1。由于您没有打破循环,因此决定在集合的最后一个元素上,并且任何真值都被最后一项getID

覆盖。
for(int i = 0; i < sList.Count; i++)
{
     if(sList[i].getID == 1)
     {
          value = true;
          break;
     }        
}

if(value)
{
    //There was at least one element having true  for  getID 
}
else
{
   //There was not element having true for  getID 
}

如果您可以使用linq,则可以使用Any

bool value = sList.Any(item => item.getID == 1);

答案 3 :(得分:0)

它只返回列表中最后一项的比较,因为它在找到所需项目后继续迭代列表。每次循环到下一个项目时,value的值都会被覆盖。因此,只保留value的最后一个值。

当你找到匹配时,你可以“退出循环”,如下所示:

for(int i = 0; i < sList.Count; i++)
{
     if(sList[i].getID == 1)
     {
          value = true;
          break; // exit the loop
     } 
     else if(sList[i].getID == 0)
     {
          value = false;
     }
}

但实际上有一种更简单的方法。如果任何项目与提供的条件匹配,则可枚举集合上的.Any()扩展方法将返回true。像这样:

value = sList.Any(x => x.getID == 1);