我正在遍历2d数组,在每一行的末尾,我需要找到最大值。每行有6个值,因此使用Math.Max重复可能很长。那么,除了Math.Max之外,还有其他要使用的东西吗?之后,我不需要知道结束的值,而是需要知道最高值的变量名。有什么建议吗?
这是我当前的代码。
for(int col = 0; col < geneArrays.GetLength(0); col++)
{
for(int row = 0; row < geneArrays.GetLength(1); row++)
{
float G = 0f, Y = 0f, H = 0f, X = 0f, W = 0f;
if (geneArrays[col][row] == 'G')
{
G += 0.6f;
}
else if (geneArrays[col][row] == 'Y')
{
Y = +0.6f;
}
else if (geneArrays[col][row] == 'H')
{
H = +0.6f;
}
else if (geneArrays[col][row] == 'X')
{
X = +0.6f;
}
else if (geneArrays[col][row] == 'W')
{
W = +0.6f;
}
string nameOfVariable = nameof(Math.Max(G,Y);
}
}
我显然没有正确使用nameof,我认为Math.Max使它出错。
Math.Max返回两个输入值的值。在此示例中,您将只知道G,Y的值。但是,考虑到您拥有多个然后被完全忽略的值,这毫无意义。我建议您将它们添加到列表中,并对它们进行排序,以便可以找到顶部变量:
class Program
{
static void Main(string[] args)
{
char[,] dataArray = new char[3, 10];
//Test data input generation.
for (int i = 0; i < 10; i++)
{
dataArray[0, 0] = 'G';
dataArray[0, 1] = 'Y';
dataArray[0, 2] = 'H';
dataArray[0, 3] = 'X';
dataArray[0, 4] = 'W';
dataArray[0, 5] = 'G';
dataArray[0, 6] = 'G';
dataArray[0, 7] = 'Y';
dataArray[0, 8] = 'W';
dataArray[0, 9] = 'X';
dataArray[1, 0] = 'G';
dataArray[1, 1] = 'Y';
dataArray[1, 2] = 'H';
dataArray[1, 3] = 'X';
dataArray[1, 4] = 'W';
dataArray[1, 5] = 'G';
dataArray[1, 6] = 'G';
dataArray[1, 7] = 'Y';
dataArray[1, 8] = 'W';
dataArray[1, 9] = 'X';
dataArray[2, 0] = 'G';
dataArray[2, 1] = 'Y';
dataArray[2, 2] = 'H';
dataArray[2, 3] = 'X';
dataArray[2, 4] = 'W';
dataArray[2, 5] = 'G';
dataArray[2, 6] = 'G';
dataArray[2, 7] = 'Y';
dataArray[2, 8] = 'W';
dataArray[2, 9] = 'X';
}
List<List<NameAndValue>> totalList = new List<List<NameAndValue>>();
for (int j = 0; j < 3; j++)
{
List<NameAndValue> geneNameValues = CreateNameAndValueList();
for (int k = 0; k < 10; k++)
{
switch (dataArray[j, k])
{
case 'G':
{
geneNameValues.First(x => x.Name.Equals('G')).Value += 0.6m;
break;
}
case 'Y':
{
geneNameValues.First(x => x.Name.Equals('Y')).Value += 0.6m;
break;
}
case 'H':
{
geneNameValues.First(x => x.Name.Equals('H')).Value += 0.6m;
break;
}
case 'X':
{
geneNameValues.First(x => x.Name.Equals('X')).Value += 0.6m;
break;
}
case 'W':
{
geneNameValues.First(x => x.Name.Equals('W')).Value += 0.6m;
break;
}
}
}
totalList.Add(geneNameValues);
}
int listCount = 0;
foreach (List<NameAndValue> list in totalList)
{
list.Sort((x, y) => x.Value.CompareTo(y.Value));
NameAndValue highestValue = list.Last();
Console.WriteLine("List-count: " + listCount + " The highest value was: " + highestValue.Name + " with a score of: " + highestValue.Value);
listCount++;
}
}
public static List<NameAndValue> CreateNameAndValueList()
{
NameAndValue item1 = new NameAndValue() { Name = 'G', Value = 0m };
NameAndValue item2 = new NameAndValue() { Name = 'Y', Value = 0m };
NameAndValue item3 = new NameAndValue() { Name = 'H', Value = 0m };
NameAndValue item4 = new NameAndValue() { Name = 'X', Value = 0m };
NameAndValue item5 = new NameAndValue() { Name = 'W', Value = 0m };
List<NameAndValue> valueList = new List<NameAndValue>() { item1, item2, item3, item4, item5 };
return valueList;
}
}
public class NameAndValue
{
public decimal Value { get; set; }
public char Name { get; set; }
}
我建议您为这样的事情设置单元测试:
提供一组受控的输入数据,您可以在其中确定预期的结果。
然后考虑您的期望值边界。建立您确定的足够样本,测试将捕获其中的任何逻辑错误,然后继续进行逻辑优化。有很多工作要做。
我知道这是一种重写。但是它确实执行了您要求的功能。现在,您只需要将硬编码的3,10值更改为您的foreach系统。
但是如果没有更好的输入,我将不敢写一个现实的实现。
另外,我将浮点数更改为十进制C#在舍入浮点数方面也很糟糕。特别是在计算中。如果要查看对人脑有意义的数字,请使用十进制。
只需将此代码复制到{}的“命名空间”集中,它将执行。而且只要名称空间是控制台应用程序:)