C# 如何判断 List<T> 中包含某个属性的对象? 就是说,List<Person> 中如何判
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何判断 List<T> 中包含某个属性的对象? 就是说,List<Person> 中如何判相关的知识,希望对你有一定的参考价值。
C# 如何判断 List<T> 中包含某个属性的对象? 就是说,List<Person> 中如何判断是否包含年龄为 xx 的对象???(其中,年龄是Person的一个属性)
list的find方法 如:
Person per = list.Find(delegate(Person p) return p.age == 20; )//只返回第一个匹配List<Person> plist = list.FindAll(delegate(Person p) return p.age == 20; )//返回所有匹配追问
它返回的是bool值?像Contains一样?
追答你不是person对象吗,第一个返回对象,第二个返回list集合
参考技术A bool b= lst.Any(p=>p.Age==xx)//using System.Linq; 参考技术B 把LIST<T>转为IEnumerable<T>接口数据使用IEnumerable<T>扩展方法where(entity=entity.age==20);需要3.5版本支持
基于嵌套列表中包含的 id 元素比较两个通用列表的最有效方法 (C#)
【中文标题】基于嵌套列表中包含的 id 元素比较两个通用列表的最有效方法 (C#)【英文标题】:Most efficient way to compare two generic lists based on id elements contained within nested list (C#) 【发布时间】:2021-01-28 14:49:18 【问题描述】:我有两个通用的项目列表,每个列表都包含一个供应商列表及其 ID:
List<ExisitingItems>
List<Suppliers>
List <PotentialMatches>
List<Suppliers>
Suppliers
SupplierId
Name
我需要根据嵌套的供应商 ID 和名称,将现有项目列表与潜在匹配项列表进行比较。
我目前将这两个列表与所需的结果进行比较,如下所示:
foreach (var potentialMatch in _potentialMatches)
foreach (var supplier in potentialMatch.Suppliers)
var match = ExistingItems.Find
(e => e.Suppliers.Any
(s => s.SupplierId == supplier.SupplierItemId && s.Name == supplier.Name));
//Do stuff with match
但是,当处理大于 500k 的大量记录时,效率不高且执行速度非常慢。
我怎样才能更有效地执行相同类型的比较?
【问题讨论】:
【参考方案1】:您当前的算法似乎是O(n*m*s*s)
,其中 n = 现有项目的数量,m = 潜在匹配的数量,s = 每个现有项目/PotentialMatch 的平均供应商数量。您可以通过使用哈希集来匹配供应商,将运行时间减少到O(n*m*s)
。
通用版本如下所示
public static IEnumerable<(T1, T2)> SetJoin<T1, T2, TKey>(
IEnumerable<T1> t1s,
IEnumerable<T2> t2s,
Func<T1, IEnumerable<TKey>> t1Key,
Func<T2, IEnumerable<TKey>> t2Key) where TKey : IEquatable<TKey>
foreach (var t1 in t1s)
var t1Keys = new HashSet<TKey>(t1Key(t1));
foreach (var t2 in t2s)
// t2Key(t2) would be called many times,
// might be worth pre-computing it for each t2.
if (t2Key(t2).Any(t1Keys.Contains))
yield return (t1, t2);
然后这样称呼它
SetJoin<ExistingItems, PotentialMatches, int>(
existingItems,
potentialMatches,
e=> e.Suppliers.Select(s => s.Id),
p => p.Suppliers.Select(s => s.Id))
此外,虽然 linq 可以生成紧凑且漂亮的代码,但如果性能很重要,使用常规循环编写等效逻辑通常会更快。
【讨论】:
以上是关于C# 如何判断 List<T> 中包含某个属性的对象? 就是说,List<Person> 中如何判的主要内容,如果未能解决你的问题,请参考以下文章