C# 基于日期合并列表中的数据
我有一个使用这个类的通用列表C# 基于日期合并列表中的数据,c#,algorithm,C#,Algorithm,我有一个使用这个类的通用列表 public class Data { public string Date { get; set; } public int OkRecords { get; set; } public int ErrorRecords { get; set; } } 我还有列表,其中包含唯一的日期。我需要以这样的方式添加原始列表的数据,即一个日期应该只有一条记录,即如果有10个唯一的日期,那么应该只有10条记录从原始列表中过滤出来。我已经实现了以下逻辑
public class Data
{
public string Date { get; set; }
public int OkRecords { get; set; }
public int ErrorRecords { get; set; }
}
我还有列表
,其中包含唯一的日期。我需要以这样的方式添加原始列表的数据,即一个日期应该只有一条记录,即如果有10个唯一的日期,那么应该只有10条记录从原始列表中过滤出来。我已经实现了以下逻辑,但是如果有超过100000个数据,这将花费太多的时间
int distinctDatesCount = distinctDates.Count;
for (int i = 0; i < distinctDatesCount; i++)
{
string date = distinctDates[i];
int ok = 0, error = 0;
foreach (var item in dataList.Where(w => w.Date == date))
{
ok += item.OkRecords;
error += item.ErrorRecords;
}
Data dataValues = new Data
{
Date = date,
OkRecords = ok,
ErrorRecords = error
};
DataListCombined.Add(dataValues);
}
int distinctdatescont=distinctDates.Count;
for(int i=0;iw.Date==Date))
{
ok+=item.ok记录;
错误+=item.ErrorRecords;
}
数据值=新数据
{
日期=日期,
ok记录=ok,
ErrorRecords=错误
};
DataListCombined.Add(dataValues);
}
DataListCombined是存储新合并数据的列表
我以字符串格式存储了日期,因为我在其他地方使用它时需要使用字符串格式。您可以使用Linq按日期按数据分组,然后使用将计数添加到单个对象中
var DataListCombined = dataList.GroupBy(data => data.Date)
.Select(groupedData =>
new Data {
Date = groupedData.Key,
OkRecords = groupedData.Sum(item => item.OkRecords),
ErrorRecords = groupedData.Sum(item => item.ErrorRecords)
})
.Where(data => distinctDates.Contains(data.Date))
.ToList();
您还可以查看此资源以了解更多示例
我个人使用团体加入。因为数据列表中的记录不应该出现在最终结果中
public class Data
{
public string Date { get; set; }
public int OkRecords { get; set; }
public int ErrorRecords { get; set; }
}
class Program
{
static void Main(string[] args)
{
Random rand = new Random();
List<string> distinctDates = new List<string>();
for (int i = 0; i < 10000; i++)
{
distinctDates.Add( rand.Next(1, 12) + "/" + rand.Next(1, 30) + "/1");
}
List<Data> dataList = new List<Data>();
for (int i = 0; i < 10000; i++)
{
dataList.Add(new Data{ Date = rand.Next(1,12)+"/"+rand.Next(1, 30)+"/1", OkRecords=0, ErrorRecords=1});
}
Stopwatch watch = new Stopwatch();
watch.Start();
Method1(distinctDates, dataList);
watch.Stop();
Console.WriteLine(watch.Elapsed);
watch.Reset();
watch.Start();
Method2(distinctDates, dataList);
watch.Stop();
Console.WriteLine(watch.Elapsed);
Console.ReadLine();
}
private static void Method1(List<string> distinctDates, List<Data> dataList)
{
List<Data> DataListCombined = new List<Data>();
int distinctDatesCount = distinctDates.Count;
for (int i = 0; i < distinctDatesCount; i++)
{
string date = distinctDates[i];
int ok = 0, error = 0;
foreach (var item in dataList.Where(w => w.Date == date))
{
ok += item.OkRecords;
error += item.ErrorRecords;
}
Data dataValues = new Data
{
Date = date,
OkRecords = ok,
ErrorRecords = error
};
DataListCombined.Add(dataValues);
}
}
private static void Method2(List<string> distinctDates, List<Data> dataList)
{
List<Data> DataListCombined = distinctDates.GroupJoin(
dataList,
distinctDateItem => distinctDateItem,
dataListItem => dataListItem.Date,
(dataListItem, distinctDateItems) => new Data
{
ErrorRecords = distinctDateItems.Sum(item => item.ErrorRecords),
OkRecords = distinctDateItems.Sum(item => item.OkRecords),
Date = dataListItem
}
).ToList();
}
}
公共类数据
{
公共字符串日期{get;set;}
公共记录{get;set;}
公共int错误记录{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
Random rand=新的Random();
List distinctDates=新列表();
对于(int i=0;i<10000;i++)
{
添加(rand.Next(1,12)+“/”+rand.Next(1,30)+“/1”);
}
List dataList=新列表();
对于(int i=0;i<10000;i++)
{
添加(新数据{Date=rand.Next(1,12)+“/”+rand.Next(1,30)+“/1”,OkRecords=0,ErrorRecords=1});
}
秒表=新秒表();
watch.Start();
方法1(区分日期、数据表);
看,停;
控制台写入线(手表已过);
watch.Reset();
watch.Start();
方法2(区分日期、数据表);
看,停;
控制台写入线(手表已过);
Console.ReadLine();
}
私有静态void方法1(列表distinctdate、列表dataList)
{
List DataListCombined=新列表();
int distinctdatescont=distinctDates.Count;
for(int i=0;iw.Date==Date))
{
ok+=item.ok记录;
错误+=item.ErrorRecords;
}
数据值=新数据
{
日期=日期,
ok记录=ok,
ErrorRecords=错误
};
DataListCombined.Add(dataValues);
}
}
私有静态void方法2(列表distinctdate、列表dataList)
{
List DataListCombined=distinctDates.GroupJoin(
数据列表,
distinctDateItem=>distinctDateItem,
dataListItem=>dataListItem.Date,
(dataListItem,distinctDateItems)=>新数据
{
ErrorRecords=distinctDateItems.Sum(item=>item.ErrorRecords),
OkRecords=distinctDateItems.Sum(item=>item.OkRecords),
日期=数据列表项
}
).ToList();
}
}
您可以使用lInq GroupBy按数据分组,然后将计数聚合为单个objects@IvanStoevaddedI也喜欢这种方法。我不太明白你所说的是什么意思,因为数据列表中的记录不应该出现在最终结果中。你们能澄清一下吗?当你们像在数据库中合并一样合并它的时候。你有三种情况:1。日期出现在两侧2。日期仅在distinctDates 3中。日期仅在数据列表中,您将返回一个数据实例。但是您想如何合并。您可以说:-如果日期仅存在于distinctdate,则我的结果不应包含此日期的实例(您和我所做的)-如果日期仅存在于DataList中,则我的结果不应包含此日期的实例-日期必须同时存在于两者中,才能具有相应的日期