在c#中使用for循环遍历主数据

本文关键字:循环 遍历 数据 for | 更新日期: 2023-09-27 18:03:42

我想就真实场景的最佳编码实践提出建议。情况是这样的:我有一张100项的清单。

public CustomObject 
{
    public int id {get;set;}
    public string name {get;set;}
}
List<CustomObject> lstObj = new List<CustomObject>();

lstobj的样例值可以像

A,1 B,2 C,3 C,4 C,5等

现在,我有了如下的表格数据:

      Low  High
A     10   100
Z     89   100

当循环遍历列表时,我需要检查该数据,如果假设A值大于100,我需要将其放入某个xml文件。

我的方法是

a)我将把这个主数据放入一个列表格式,例如:
public class CheckValues
{  
    public string name { get;set;}
    public int lowerlimit { get;set;}  
    public int upperlimit {get;set;} 
}

和用

这样的数据填充列表
    Low  High
A   10   100
Z   89   100

b)使用foreach循环,我将循环lstobj项,在每次迭代中,我将再次迭代列表以检查项是否存在,如果存在,值(最大值或最小值)是多少

基本上我使用了两个for循环。这种做法是否可以接受,或者是否有任何最佳做法/建议来改进这方面的做法?

在c#中使用for循环遍历主数据

如果每个列表中的条目数量很少,那么您的解决方案可能是可接受的解决方案,但如果它们中的任何一个都很大,则这是最糟糕的方法之一。列表表示线性查找(n*m)。如果您使用其他容器或者先排序,您可以获得更好的(n*1)性能。

我建议删除name:

public class CheckValues
{  
  public int lowerlimit {get;set;}
  public int upperlimit {get;set;} 
}

然后使用Dictionary<string, CheckValues>查找极限

Dictionary<string, CheckValues> limits /* = ... */;
foreach(var item in data) // Just one foreach
{
    var limit = limits[item]; // Looking up the limit is O(1) instead of O(n)
}

或者使用LINQ

List<CustomObject> lstObj = new List<CustomObject>(){ new CustomObject(){ id = 1, name = "name1" }, new CustomObject() { id  = 2, name = "name2" } };

则可以选择最大值

CustomObject highestvalue = lstObj.OrderByDescending(x => x.id).FirstOrDefault();

或最低值

CustomObject lowestvalue = lstObj.OrderBy(x => x.id).FirstOrDefault();

也可以找到大于100的数据id

var objgreaterthan100 = lstObj.FindAll(x => x.id > 100);

,然后你可以迭代到你的objgreaterthan100,然后放入XML。

foreach (var CustomObject in objgreaterthan100)
            {
                //your code for saving in xml
            }