C# 提高在列表中修改对象属性的效率

C# 提高在列表中修改对象属性的效率,c#,.net,list,C#,.net,List,我有一个正在使用的自定义对象列表。我需要找到匹配的对象,并将两个属性保存到该对象,然后继续。我忍不住认为我处理这些对象的方法是次优的。鉴于我正在处理大量数据(在本例中是一个包含约10000个对象的列表,但在其他情况下则要大得多),我将非常感谢能够帮助我优化流程的任何信息 List<WebListingVerification> listings = new List<WebListingVerification>(); //This list is fully popul

我有一个正在使用的自定义对象列表。我需要找到匹配的对象,并将两个属性保存到该对象,然后继续。我忍不住认为我处理这些对象的方法是次优的。鉴于我正在处理大量数据(在本例中是一个包含约10000个对象的列表,但在其他情况下则要大得多),我将非常感谢能够帮助我优化流程的任何信息

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;
}

删除并重新添加项目的唯一方法是将其从列表中的位置移动到末尾。你真的需要吗