以下代码将根据 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;
}
}
答案 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);