C# 提高在列表中修改对象属性的效率
我有一个正在使用的自定义对象列表。我需要找到匹配的对象,并将两个属性保存到该对象,然后继续。我忍不住认为我处理这些对象的方法是次优的。鉴于我正在处理大量数据(在本例中是一个包含约10000个对象的列表,但在其他情况下则要大得多),我将非常感谢能够帮助我优化流程的任何信息C# 提高在列表中修改对象属性的效率,c#,.net,list,C#,.net,List,我有一个正在使用的自定义对象列表。我需要找到匹配的对象,并将两个属性保存到该对象,然后继续。我忍不住认为我处理这些对象的方法是次优的。鉴于我正在处理大量数据(在本例中是一个包含约10000个对象的列表,但在其他情况下则要大得多),我将非常感谢能够帮助我优化流程的任何信息 List<WebListingVerification> listings = new List<WebListingVerification>(); //This list is fully popul
List<WebListingVerification> listings = new List<WebListingVerification>(); //This list is fully populated, and is actually passed into the function.
string sku = reader["vsr_sku"].ToString();
string vendorName = reader["v_name"].ToString();
string vendorSku = reader["vsr_vendor_sku"].ToString();
WebListingVerification listing = listings.Find(x => x.SKU == sku);
if(listing != null)
{
listings.Remove(listing);
listing.Vendor = vendorName;
listing.VendorSKU = vendorSku;
listings.Add(listing);
}
列表列表=新列表()//此列表已完全填充,并实际传递到函数中。
字符串sku=读卡器[“vsr_sku”]。ToString();
字符串vendorName=reader[“v_name”].ToString();
字符串vendorSku=reader[“vsr_vendor_sku”]。ToString();
WebListingVerificationListing=listings.Find(x=>x.SKU==SKU);
if(清单!=null)
{
列表。删除(列表);
listing.Vendor=vendorName;
listing.VendorSKU=VendorSKU;
列表。添加(列表);
}
正如您在上面看到的,我首先删除列表,然后编辑它,然后重新添加它。我想有一种方法可以在不运行Remove/Add的情况下安全地编辑列表中的对象,这会有很大帮助,但我似乎找不到如何做。我不确定是否可以使用listings.Find调用(listings.Find(x=>x.SKU==SKU)。Vendor=“Vendor”
)执行复合函数,但这是不安全的,因为在这种情况下,无论如何都会返回空值
如果您有任何帮助,我们将不胜感激
编辑
感谢您的评论,我不明白List.Find函数调用的结果实际上是指向列表中对象的指针,而不是对象的副本。这就解决了我的问题
另外,谢谢你的补充回答。我在寻找一个简单的改进,主要是删除Add/remove例程,但是额外的答案给了我一些关于如何在将来编写这些例程的好主意,这可能会带来一些显著的性能改进。在过去的几个月里,我一直专注于报告任务,所以这个示例片段与我从各种源数据库收集数据的100个不同例程非常相似。再次感谢您的输入。要加快查找速度,您可以先将列表转换为字典。请注意,如果更新方法是一个方法,则不应在方法内部进行转换,而应在更新循环外部进行转换
var dictionary = listings.ToDictionary(l => l.SKU);
并从字典中获取具有sku值的项
要加快查找速度,可以先将列表转换为字典。请注意,如果更新方法是一个方法,则不应在方法内部进行转换,而应在更新循环外部进行转换
var dictionary = listings.ToDictionary(l => l.SKU);
并从字典中获取具有sku值的项
如果您的项目是唯一的,我可以建议您使用
哈希集
HashSet.Contains()
在这样的大型数据集上性能是惊人的。如果您的项目是唯一的,我可以推荐一个HashSet
public class WebListingVerification
{
public string Sku { get; set; }
public string VendorName { get; set; }
public string VendorSku { get; set; }
}
public class ListingManager : IEnumerable <WebListingVerification>
{
private Dictionary<string, WebListingVerification> _webListDictionary;
public ListingManager(IEnumerable <WebListingVerification> existingListings)
{
if (existingListings == null)
_webListDictionary = new Dictionary<string, WebListingVerification>();
else
_webListDictionary = existingListings.ToDictionary(a => a.Sku);
}
public void AddOrUpdate (string sku, string vendorName, string vendorSku)
{
WebListingVerification verification;
if (false == _webListDictionary.TryGetValue (sku, out verification))
_webListDictionary[sku] = verification = new WebListingVerification();
verification.VendorName = vendorName;
verification.VendorSku = vendorSku;
}
public IEnumerator<WebListingVerification> GetEnumerator()
{
foreach (var item in _webListDictionary)
yield return item.Value;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
HashSet.Contains()
在这样的大型数据集上,性能是惊人的。公共类WebListingVerification
public class WebListingVerification
{
public string Sku { get; set; }
public string VendorName { get; set; }
public string VendorSku { get; set; }
}
public class ListingManager : IEnumerable <WebListingVerification>
{
private Dictionary<string, WebListingVerification> _webListDictionary;
public ListingManager(IEnumerable <WebListingVerification> existingListings)
{
if (existingListings == null)
_webListDictionary = new Dictionary<string, WebListingVerification>();
else
_webListDictionary = existingListings.ToDictionary(a => a.Sku);
}
public void AddOrUpdate (string sku, string vendorName, string vendorSku)
{
WebListingVerification verification;
if (false == _webListDictionary.TryGetValue (sku, out verification))
_webListDictionary[sku] = verification = new WebListingVerification();
verification.VendorName = vendorName;
verification.VendorSku = vendorSku;
}
public IEnumerator<WebListingVerification> GetEnumerator()
{
foreach (var item in _webListDictionary)
yield return item.Value;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
{
公共字符串Sku{get;set;}
公共字符串VendorName{get;set;}
公共字符串VendorSku{get;set;}
}
公共类列表管理器:IEnumerable
{
私人词典(weblistdirectionary);;
public ListingManager(IEnumerable existingListings)
{
如果(existingListings==null)
_webListDictionary=新字典();
其他的
_webListDictionary=existingListings.ToDictionary(a=>a.Sku);
}
公共无效地址更新(字符串sku、字符串vendorName、字符串vendorSku)
{
网站列表验证;
if(false==\u webListDictionary.TryGetValue(sku,out验证))
_webListDictionary[sku]=验证=新建WebListingVerification();
verification.VendorName=VendorName;
verification.VendorSku=VendorSku;
}
公共IEnumerator GetEnumerator()
{
foreach(webListDictionary中的变量项)
收益返回项目。价值;
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
公共类WebListingVerification
{
公共字符串Sku{get;set;}
公共字符串VendorName{get;set;}
公共字符串VendorSku{get;set;}
}
公共类列表管理器:IEnumerable
{
私人词典(weblistdirectionary);;
public ListingManager(IEnumerable existingListings)
{
如果(existingListings==null)
_webListDictionary=新字典();
其他的
_webListDictionary=existingListings.ToDictionary(a=>a.Sku);
}
公共无效地址更新(字符串sku、字符串vendorName、字符串vendorSku)
{
网站列表验证;
if(false==\u webListDictionary.TryGetValue(sku,out验证))
_webListDictionary[sku]=验证=新建WebListingVerification();
verification.VendorName=VendorName;
verification.VendorSku=VendorSku;
}
公共IEnumerator GetEnumerator()
{
foreach(webListDictionary中的变量项)
收益返回项目。价值;
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
无需删除对象并将其重新添加到列表中。公正的
if(listing != null)
{
listing.Vendor = vendorName;
listing.VendorSKU = vendorSku;
}
无需删除对象并将其重新添加到列表中。公正的
if(listing != null)
{
listing.Vendor = vendorName;
listing.VendorSKU = vendorSku;
}
删除并重新添加项目的唯一方法是将其从列表中的位置移动到末尾。你真的需要吗