获取多个整型参数的最大值

3

我有一系列需要读取的参数,需要获取它们的最大值。我所说的不是一个列表而是多个整数值:

int ColAssComm = Register.getImportExcelDSTV("AssComm")-1;
int ColAssDwg = Register.getImportExcelDSTV("AssDwg") - 1;
int ColAssGpe = Register.getImportExcelDSTV("AssGp") - 1;
int ColAssName = Register.getImportExcelDSTV("AssName") - 1;
int ColAssPrio = Register.getImportExcelDSTV("AssPrio") - 1;
int ColAssPds = Register.getImportExcelDSTV("AssPds") - 1;
int ColAssSurfPaint = Register.getImportExcelDSTV("AssSurfPaint") - 1;
int ColAssQty = Register.getImportExcelDSTV("AssQty") - 1;
int ColRepName = Register.getImportExcelDSTV("RepName") - 1;
int ColRepQty = Register.getImportExcelDSTV("RepQty") - 1;
int ColRepExecutionClass = Register.getImportExcelDSTV("RepExecutionClass") - 1;
int ColRepTreatment = Register.getImportExcelDSTV("RepTreatment");

我需要做类似以下的事情:

int maxvalue = Max(ColAssComm,ColAssDwg..., ColRepTreatment)

有没有一种方法可以一次性完成所有操作?


2
把它们都放在一个数组里,然后调用 Max 函数?int maxValue = (new[] { item1, item2, ...}).Max(); - user10608418
1
另一个选择是首先不使用单独的变量。相反,使用Dictionary<string, int>来保存这些值。然后,您可以使用与从getImportExcelDSTV()检索它们时使用的相同字符串进行查找。您还可以使用LINQ查询它,以获取具有键名的最大值。 - Idle_Mind
@Idle_Mind 假设我已经制作了一个应用程序(已经很大了)。我有两种参数:对所有用户通用的参数(保存在数据库中),然后是每个用户可能不同的参数。在这种情况下,这是为了将命名导入Excel或csv文件。根据制表人员的不同,列可能会有所不同,这就是为什么我制作了一个“配置”窗口,用户可以在其中设置自己喜欢的配置。然后我想读取最大值,以便在加载Excel时,我可以说我需要读取多少列。 - Siegfried.V
@OlivierRogier 对不起,也许“regiser”不是一个好的翻译,但是注册表呢?(我用regedit打开的那个,叫什么名字?) - Siegfried.V
@Idle_Mind,使用XML文件与注册表相比有什么优势?实际上,我喜欢使用字典的想法,但我更喜欢使用注册表而不是文件,是否有注册表不好的原因?(在这方面提出了一个问题) - Siegfried.V
显示剩余11条评论
2个回答

4
另一个选项是创建一个类似以下代码的通用方法:
public T FindMax<T>(params T[] items)
{
    return items.Max();
}

然后,您可以将动态数量的参数传递到该方法中,因此您可以将示例中的所有变量都传递到此方法中,并获取所需类型的最大值,这适用于 整数双精度浮点数小数等等。


1
这就是方法。 - Wyck
@RyanWilson 等等等等...你是在告诉我,我可以使用对象来创建那种类型的函数吗?我的意思是,如果我想要创建一个名为AddQuantities()的函数,我可以传入任何对象,并编写return items.Sum(x=>x.Qty(假设所有对象都有一个字段“Qty”...如果是这样,你刚刚让我开心了,因为我已经寻找这样的解决方案好几个月了... - Siegfried.V
@Siegfried.V 是的。你可以潜在地将 objects 传递给你提出的方法 AddQuantitites,并使用 Linq 来对它们的 .Qty 属性进行求和。泛型 是一个非常好的工具,建议多学习。 - Ryan Wilson
@RyanWilson,你得到了我的全部关注,当然我会学习它们,我已经将它们与我现在需要的函数一起使用,然后尝试使用它们替换一些旧函数。非常感谢你的帮助 :) - Siegfried.V
@Siegfried.V 不客气。很高兴我能帮到你。编码愉快! - Ryan Wilson

1
如@Idle_Mind所建议的,您可以使用类似于以下的字典:
using System.Collection.Generic;

string[] ParamNames =
{
  "AssComm", "AssDwg", "AssGp", "AssName", "AssPrio", "AssPds",
  "AssSurfPaint", "AssQty", "RepName", "RepQty", "RepExecutionClass", "RepTreatment"
};

Dictionary<string, int> ParamsData = new Dictionary<string, int>();

因此,我们定义一个包含所需参数名称列表的数组。
接下来,我们定义一个字典,将参数名称作为键而不使用多个变量。
然后,我们从存储的值初始化字典。
foreach ( string paramName in ParamNames )
  ParamsData.Add(paramName, Register.getImportExcelDSTV(paramName) - 1);

因此,我们有一种简单的方法来应用我们需要的任何东西,比如Max,到集合上。
using System.Linq;

int max = ParamsData.Values.Max();

同时,我们可以使用以下方式访问参数:
ParamsData["AssComm"] = 10;

我们当然可以定义字符串变量,以避免通过字符串书写这些名称:
string ColAssCommName = "AssComm";
string ColAssDwgName = "AssDwg";
...

Doing that we write:

string[] ParamNames = { ColAssCommName, ColAssDwgName ...}

并且:

ParamsData[ColAssCommName] = 10;

To save we write something like that:

foreach ( string paramName in ParamNames )
  Register.setImportExcelDSTV(paramName, ParamsData[paramName] + 1);

感谢您的支持 :) - Siegfried.V
1
我已经在2-3年前(项目开始时)使用过这个,但我不记得为什么它不符合我的需求(我还记得有时它会被重置并需要重新定义),而且我有数百个设置,所以我就停止使用它了。 - Siegfried.V
实际上,应用程序设置并不是用于数据的。因此,您可以在用户“UserDirectory\AppData\Roaming\OrganizationName\ApplicationName(\Settings) ”中使用一个文件,而不是注册表,使用任何您需要、想要或喜欢的文件格式。SQLite也可以,或者其他任何东西。 - user12031933
我并不反对改变我的编码方式...但是我已经设置了数百个参数(4年来我每天都在添加)。那么为什么使用文件而不是寄存器会是一个好的选择呢?为什么寄存器不是一个好的选项? - Siegfried.V
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接