我有一组数据存放到List,object是个实体类,里面包含了时间和一个数值,我需要根据数值进行分组,数值是有误差的,时间顺序上误差相近的归为一组,如何实现?
误差相近,也就是离散程度低。那么就是方差低。(也可以用四分位差,皮尔逊系数判定)
这个不在这里问,请移步到大学论坛的统计算法,概率算法。或者机械自动化的信号处理分析论坛种讨论
因为这类玩意是纯数学不是代码。
先建一个二维list
循环,比较,相符就add,不符就new
伪代码:
List<List<Entity>> result = new List<List<Entity>>();
List<Entity> group = new List<Entity>();
group.Add(entities[0]);
for (int i = 1; i < entities.Count; i++)
{
if (Math.Abs(entities[i].Value - entities[i - 1].Value) <= interval)
{
group.Add(entities[i]);
}
else
{
result.Add(group);
group = new List<Entity>();
group.Add(entities[i]);
}
}
result.Add(group);
微软官方的 List 在命名空间 System.Collections.Generic 中,在平时的开发中 List 用的特别多,在用的时候我们基本不会考虑在 List 中内部是怎么写的,于是,我也写了一个List,想看看是否能实现和微软官方一样的功能,当然,不是说为了和微软比比谁写的好,也没那个必要,原创轮子等于白费功夫,微软的API基本已经优化的很好了,直接拿来用就行了,我写这篇文章目的只是为了更了解 List 内部的构造,提升自己 C# 基础,功能当然不可能有官方那么多。
你可以使用C#中的GroupBy函数来实现。GroupBy函数可以根据指定的键值对列表进行分组,返回一个字典,其中键是分组的键值对,值是分组的元素列表。你可以使用一个lambda函数来定义你的键值对,以便将相邻的元素分组到一起。下面是一个示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
class Entity
{
public DateTime Time { get; set; }
public double Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Entity> entities = new List<Entity>()
{
new Entity() { Time = DateTime.Now.AddSeconds(-10), Value = 1.1 },
new Entity() { Time = DateTime.Now.AddSeconds(-9), Value = 1.2 },
new Entity() { Time = DateTime.Now.AddSeconds(-8), Value = 1.3 },
new Entity() { Time = DateTime.Now.AddSeconds(-7), Value = 1.4 },
new Entity() { Time = DateTime.Now.AddSeconds(-6), Value = 1.5 },
new Entity() { Time = DateTime.Now.AddSeconds(-5), Value = 2.0 },
new Entity() { Time = DateTime.Now.AddSeconds(-4), Value = 2.1 },
new Entity() { Time = DateTime.Now.AddSeconds(-3), Value = 2.2 },
new Entity() { Time = DateTime.Now.AddSeconds(-2), Value = 2.3 },
new Entity() { Time = DateTime.Now.AddSeconds(-1), Value = 2.4 }
};
var groups = entities.GroupBy(entity => Math.Round(entity.Value)).ToList();
foreach (var group in groups)
{
Console.WriteLine("Group " + group.Key);
foreach (var entity in group)
{
Console.WriteLine(entity.Time);
}
}
}
}
```c#
在这个例子中,我们将实体类Entity的Value属性作为键值对,将相邻的元素分组到一起。你可以根据你的实体类来修改这个代码。
```