C# 基于数组的一个字段搜索数组

C# 基于数组的一个字段搜索数组,c#,arrays,C#,Arrays,我有一个类数组,类有两个字段:一个字母和一个数字 我正在寻找一种写作方式: 对于每个包含指定字母的字段,请使用数字 我知道我可以这样做: for(int i = 0; i < Array.Length ; i++) if(Array[i].letter == 'a') do something with Array[i].number class MyClass { public int MyNumber { get; set; } public char MyL

我有一个类数组,类有两个字段:一个字母和一个数字

我正在寻找一种写作方式:

对于每个包含指定字母的字段,请使用数字

我知道我可以这样做:

for(int i = 0; i < Array.Length ; i++)
    if(Array[i].letter == 'a') do something with Array[i].number
class MyClass
{
    public int MyNumber { get; set; }
    public char MyLetter { get; set; }
    public bool Test { get; set; }
}
for(int i=0;i
有没有一种方法可以用foreach循环写下来,或者这是正确的方法

编辑:在我的例子中,“做点什么”的意思是:(我在课堂上需要第三个字段,我们称之为test,输入bool,和3个int变量,x=0和y=0,z=我之前计算过的一些数字)

if(数组[i]。字母=='a')
if(数组[i]。测试==false)
if(数组[i].数
您可以使用以下选项:

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

但这看起来有点难看,至少对我来说。。。这取决于您。

您可以使用以下选项:

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

但这看起来有点难看,至少对我来说。。。这取决于您。

假设您的数组中填充了MyClass类型的对象

foreach(MyClass obj in Array) {
    if(obj.letter == 'a') {
        // do something
    }
}

假设数组中填充了MyClass类型的对象

foreach(MyClass obj in Array) {
    if(obj.letter == 'a') {
        // do something
    }
}

让我们假设您的类如下所示:

for(int i = 0; i < Array.Length ; i++)
    if(Array[i].letter == 'a') do something with Array[i].number
class MyClass
{
    public int MyNumber { get; set; }
    public char MyLetter { get; set; }
    public bool Test { get; set; }
}
您有一个名为myList的
列表

如果希望遍历字母为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++;
}
foreach(myList.Where中的MyClass MyClass(c=>c.MyLetter=='a'&&&!c.Test))
{
if(myClass.MyNumber
让我们假设您的类如下所示:

for(int i = 0; i < Array.Length ; i++)
    if(Array[i].letter == 'a') do something with Array[i].number
class MyClass
{
    public int MyNumber { get; set; }
    public char MyLetter { get; set; }
    public bool Test { get; set; }
}
您有一个名为myList的
列表

如果希望遍历字母为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++;
}
foreach(myList.Where中的MyClass MyClass(c=>c.MyLetter=='a'&&&!c.Test))
{
if(myClass.MyNumber
有很多方法可以实现您对linq的追求

var valids = arrayName.Where(i => i.letter =='a' && !i.test);
var x = valids.Count(i => i.number < z);
var y = valids.Count() - x;
但你目前的方法很清楚它试图做什么,而且看起来很容易维护


不过,您的变量名有点粗略,但我希望这只是伪代码:)

有一些方法可以实现您对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或for here,则没有区别。你有什么问题?这似乎完全正确。还想知道您不使用KeyValuePair列表或字典的原因吗?您有几种方法来操作集合类型,从简单迭代循环、并发、LINQ等。。。这基本上取决于你想做什么。我想说的是,你可以使用foreach,但除了一点点可读性(范围变量)之外,你不会从中获得太多。如果你能澄清“做点什么”,我们会更有帮助。是总和、平均值还是排除?您当前的方法有什么问题?对我来说,这似乎是完全正确的。如果您使用foreach或for here,则没有区别。你有什么问题?这似乎完全正确。还想知道您不使用KeyValuePair列表或字典的原因吗?您有几种方法来操作集合类型,从简单迭代循环、并发、LINQ等。。。这基本上取决于你想做什么。我想说的是,你可以使用foreach,但除了一点点可读性(范围变量)之外,你不会从中获得太多。它清晰简洁,这就是你在这里真正希望的。我使用数组名作为一个例子,我在代码中有8个。你应该能够将它们作为1个lambda表达式连接起来。其中(x=>x.letter='a'&&!x.test&&x.numberx.letter='a'&&!x.test&&x.numberclass
是一个关键字。由于我对这些构造非常陌生,您能澄清MyClass和MyClass之间的区别吗?@Januszoff在我的示例中,
MyClass
是类的名称,
MyClass
是包含该类实例的变量的名称。阅读有关foreach循环的更多信息。阅读更多关于课程的信息。@Januszoff没问题!我添加了一个示例来匹配您更新的问题。对于上一个迭代变量,请记住,
class
是一个关键字。由于我对这些构造非常陌生,您能否澄清MyClass和MyClass之间的区别?@Januszoff在我的示例中,
MyClass
是类的名称,
MyClass
是包含该类实例的变量的名称。阅读有关foreach循环的更多信息。阅读更多关于课程的信息。@Januszoff没问题!我添加了一个示例来匹配您更新的问题。