我下面有键值格式的数据,首先我想按CustomerID汇总金额,然后按降序对金额进行排序。
`
public class Customer
{
public string CustomerId { get; set; }
public double Amount { get; set; }
}
List<Customer> customers = new List<Customer>()
{
new Customer{
CustomerId ="C1",
Amount = 10
},
new Customer{
CustomerId ="C2",
Amount = 20
},
new Customer{
CustomerId ="C1",
Amount = 30
},
new Customer{
CustomerId ="C3",
Amount = 30
},
new Customer{
CustomerId ="C4",
Amount = 5
}
};
`
在最终输出中,我想将客户分类为前25%的最大值,接下来的25%的最大值和其余客户。
此处的预期输出为:-
在前25%中,客户C1的金额为40 接下来的25%,客户C3数量为30 休息时,客户C2和C4来了。
我试图使用列表和字典解决此问题,但是输入数据太大,因此执行代码需要花费很长时间。另外,字典正在为该代码占用大量内存。我想知道什么是解决此问题的最佳数据结构。
答案 0 :(得分:0)
我不确定您是否必须有List
个客户。
但是,如果我在流程中一步一步地获得Customer
,并且需要将数据存储在某个地方,那么我将实现如下所示的数据结构。
static Dictionary<string, double> customerDataTable = new Dictionary<string, double>();
在此流程中,如果需要现成的Dictionary<string, double>
对象,可以使用Dictionary<string, Customer>
代替Customer
。
然后我将提供一种更新该表的方法,例如
static void UpdateCustomerRecord(string customerId, double amount)
{
if (customerDataTable.ContainsKey(customerId))
customerDataTable[customerId] = customerDataTable[customerId] + amount;
else
customerDataTable.Add(customerId, amount);
}
并调用此方法将很简单,如下所示,
UpdateCustomerRecord("c1", 10);
UpdateCustomerRecord("c2", 20);
UpdateCustomerRecord("c1", 30);
UpdateCustomerRecord("c3", 30);
UpdateCustomerRecord("c4", 5);
在这里您必须注意,我已经淘汰了Customer
类,但是如果您的情况不可行,您可以使用Customer
类实现相同的流程(正如我上面已经提到的那样) )。
Linq
根据数据量,将存在内存需求。这是肯定的。为了优化它,您可以重新考虑所需的数据和数据类型。 (例如,如果您需要全额金额,但少于255,则可以使用字节而不是双字节)