我有一个类数组,类有2个字段:一个字母和一个数字。
我正在寻找一种写作方式:
对于包含指定字母的每个字段,请使用数字执行操作。
我知道我可以这样做:
for(int i = 0; i < Array.Length ; i++)
if(Array[i].letter == 'a') do something with Array[i].number
有没有办法用foreach循环写下来,或者这是正确的方法吗?
编辑:在我的案例中“做点什么”意味着:(我需要在课堂上使用第三个字段,让我们称之为测试,键入bool,以及3个int变量,x = 0和y = 0,以及z =我之前计算的一些数字)if(Array[i].letter == 'a')
if(Array[i].test == false)
if(Array[i].number < z) x++;
else y++;
答案 0 :(得分:2)
您可以使用以下内容:
var newArray = Array.Where(x => x.letter == 'a')
.Where(x => !x.test)
.Where(x => x.number < z);
现在你拥有数组中的所有元素(顺便说一下:Array
对你的数组来说是一个非常糟糕的名字)。但是之后您必须使用for
或foreach
循环新数组。
var newArray = Array.Where(x => x.letter == 'a' && !x.test && x.number <z)
但这看起来有点难看,至少对我来说......这取决于你。
答案 1 :(得分:2)
假设您的数组中填充了MyClass类型的对象。
foreach(MyClass obj in Array) {
if(obj.letter == 'a') {
// do something
}
}
答案 2 :(得分:2)
让我们说你的班级是这样的:
class MyClass
{
public int MyNumber { get; set; }
public char MyLetter { get; set; }
public bool Test { get; set; }
}
您已获得名为 myList 的List<MyClass>
。
如果你想遍历字母为A的类的每个实例,你可以使用LINQ:
foreach (MyClass myClass in myList.Where(c => c.MyLetter == 'A'))
{
Console.WriteLine("Number: " + myClass.MyNumber);
}
编辑:更新了您更新的问题的示例:
foreach (MyClass myClass in myList.Where(c => c.MyLetter == 'a' && !c.Test))
{
if (myClass.MyNumber < z)
x++;
else
y++;
}
答案 3 :(得分:0)
有很多方法可以用linq做你想做的事。
var valids = arrayName.Where(i => i.letter =='a' && !i.test);
var x = valids.Count(i => i.number < z);
var y = valids.Count() - x;
但这似乎并不像你目前的做法那么明显......
使用foreach循环会给你一个范围变量,如果方法扩展得更多,这可能会有所帮助。
foreach(var item in arrayName)
if(item.letter == 'a')
.....
但是你现在的方法很清楚它想要做什么,看起来很容易维护。
你的变量名有点粗略,但我希望那只是伪代码:)