list<datas> 已经取到数据,但是数据有重复的,怎样去掉重复的,求简单的代码,大神,前面答得我不太懂
发布网友
发布时间:2023-04-24 05:33
我来回答
共1个回答
热心网友
时间:2023-10-11 09:17
前面不是已经说得很清楚了吗?
// 这是扩展IEnumerable<T>泛型接口。这个扩展类不能落掉
static class ExternEnumerable {
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}
// 筛选去重调用
IEnumerable<User> ie = list; // 关键点1:先转换为IEnumerable接口类型
// 关键点2:把你需要过滤为重复的条件(即属性)用"|"进行拼接成一个key.
ie=ie.DistinctBy<User,string>(u=>u.DatasName+"|"+u.DatasType+"|"+u.DatasValue);
// 完整示例:
internal class User{
public string DatasName { get; set; }
public string DatasType { get; set; }
public string DatasValue { get; set; }
}
// 扩展IEnumerable<T>
internal static class ExternEnumerable{
// 这里的TKey泛型参数化可以理解为你要去重的条件(作为哈希Key)
// 形如:字段A+字段B+字段C+字段N 若是重复的拼接后的结果也必须相等
// 因为哈希Key是不可以重复的从而就达到了去重目的
// 这个是算法思想,需要楼主自己去体会。
internal static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>(); // 哈希值
foreach (TSource element in source) // 遍历
{
if (seenKeys.Add(keySelector(element))) // 添加哈希键
{
yield return element; // 使用yield可以提高代码性能(暂挂返回)
}
}
}
}
class App
{
unsafe static void Main(string[] args)
{
IList<User> list = new List<User>{
new User(){DatasName="类别",DatasType="INVALID",DatasValue="结构柱"},
new User(){DatasName="类别2",DatasType="INVALID2",DatasValue="结构柱2"},
new User(){DatasName="类别",DatasType="INVALID",DatasValue="结构柱"},
new User(){DatasName="类别3",DatasType="INVALID3",DatasValue="结构柱3"},
new User(){DatasName="类别",DatasType="INVALID",DatasValue="结构柱"}
};
// 去重
IEnumerable<User> ie = list; // 先转换为IEnumerable接口类型
ie=ie.DistinctBy<User,string>(u=>u.DatasName+"|"+u.DatasType+"|"+u.DatasValue);
list = ie.ToList(); // 去重后交回给list
foreach (User item in list)
{
Console.WriteLine(item.DatasName+"\t"+item.DatasType+"\t"+item.DatasValue);
}
}
}
来自:求助得到的回答