在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循环。这种做法是否可以接受,或者是否有任何最佳做法/建议来改进这方面的做法?
如果每个列表中的条目数量很少,那么您的解决方案可能是可接受的解决方案,但如果它们中的任何一个都很大,则这是最糟糕的方法之一。列表表示线性查找(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
}