根据其中一个字段搜索数组

时间:2015-03-03 07:46:20

标签: c# arrays

我有一个类数组,类有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++;

4 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

var newArray = Array.Where(x => x.letter == 'a')
    .Where(x => !x.test)
    .Where(x => x.number < z);

现在你拥有数组中的所有元素(顺便说一下:Array对你的数组来说是一个非常糟糕的名字)。但是之后您必须使用forforeach循环新数组。

编辑:Ofc。你也可以加入你的where-clause:

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')
        .....

但是你现在的方法很清楚它想要做什么,看起来很容易维护。

你的变量名有点粗略,但我希望那只是伪代码:)