我正在尝试找到总结多维数组的最佳(最快)方法,然后将其传递到对象中。
例如,如果我有包含类似于以下内容的数据的object[,] Data
:
John,Utah,Huntsville,0120152,60
John,Utah,Huntsville,06122013,40
Dallin,Maryland,CityTown,10202012,30
Aaron,Connecticut, Harbourville,12122017,100
Dallin,Maryland,CityTown,04232011,8
Aaron,Virginia,GeorgeTown,02212013,200
这将传递到一个对象中,该对象将被定义为如下所示的内容:
string name, string state, string city, List<int> date, List<double> total
因此,数据的表示形式可能如下所示:
Dallin,Maryland,CityTown
04232011, 8
10202012, 30
John,Utah,Huntsville,
0120152, 60
06122013,40
我知道我可以从每个列中获取不同的项目,然后使用 For 和 if 语句,但作为编程新手并且拥有非常大的数据集,我有点担心需要多长时间。作为一个多维数组也使得排序变得困难。因此,任何关于如何处理这个问题的信息都将不胜感激。
您是否必须将数据放在多维数组中? 例如,如果您按如下方式构建数据,该怎么办:
public class Activity
{
public int ActivityDate { get; get; }
public double ActivityTotal { get; set; }
}
public class Person
{
public string Name { get; set; }
public string State { get; set; }
public string City { get; set; }
public List<Activity> { get; set; }
}
将数据输入到这种类型的结构中应该相对容易,然后您将通过 LINQ 获得简单的排序、汇总等额外好处。
当您说"大型"数据集时... 多大才算大?
编辑:
很公平... 我没有意识到你没有控制如何将数据加载到你的对象中。
也就是说,也许域对象看起来很简单:
public class Person
{
public string Name { get; set; }
public string State { get; set; }
public string City { get; set; }
public List<int> Date { get; set; }
public List<double> Total { get; set; }
}
这是一个非常粗略的示例,说明如何将Data
对象转换为此类。 请注意,这绝对不会妨碍错误捕获或类型验证:
List<Person> p = new List<Person>();
for (int i = 0; i < Data.Length; i++)
{
p.Add(new Person()
{
Name = (string)Data[i, 0],
State = (string)Data[i, 1],
City = (string)Data[i, 2],
Date = (List<int>)Data[i, 3],
Total = (List<double>)Data[i, 4]
});
}
这是一个使用 LINQ 的解决方案(这实际上是一行代码 :-) )
var results = File.ReadAllLines(@"Your file path.txt")
.Select(record => record.Split(','))
.Select(tokens => new { Name1 = tokens[0], Name2 = tokens[1], Name3 = tokens[2], Group1 = tokens[3], Group2 = tokens[4] })
.GroupBy(x => new { x.Name1, x.Name2, x.Name3 }).ToList();
foreach(var result in results)
{
Console.WriteLine(result.Key.Name1);
Console.WriteLine(result.Key.Name2);
Console.WriteLine(result.Key.Name3);
foreach(var groupItem in result.ToList())
{
Console.WriteLine(groupItem.Group1);
Console.WriteLine(groupItem.Group2);
}
}
这些值将根据此要求进行分组。
达林,马里兰州,城镇
04232011, 8 10202012, 30
约翰,犹他州,亨茨维尔,
0120152, 60 06122013,40