【问题标题】:Fastest way of comparing two lists without using nested loops不使用嵌套循环比较两个列表的最快方法
【发布时间】:2020-11-12 14:02:30
【问题描述】:

我有两种类型:

public class SubCategories
{
    public static List<SubCategories> subCategories = new List<SubCategories>();
    public string title { get; set; }
    public string IDfromCategories { get; set; }
    public string subCategoryID { get; set; }

    public bool isChecked { get; set; }
}

public class UserInsideCategories
{
    public string userEmail { get; set; }
    public string iDfromSubCategories { get; set; }
}

还有两个列表都多次包含这个对象。

现在我想检查一个类型为SubCategories 的列表并检查每个对象是否包含与我的其他UserInsideCategories 类型的列表相同的值。具体来说,我想知道 list.SubcategoryID 上的任何对象是否等于另一个 list.IdFromSubCateogires 上的任何对象。

我是这样实现的:

List<SubCategories> branch = new List<SubCategories>();

for(int i = 0; i < subCategories.Count; i++)
{
    SubCategories e = new SubCategories();

    for(int x = 0; x < allSubs.Count; x++)
    {
        if (e.IDfromCategories == allSubs[x].iDfromSubCategories)
            e.isChecked = true;
    }

    branch.Add(e);
}


            

所以我使用的是嵌套循环。但由于我必须多次执行此操作,所以时间太长了。

我还考虑将 SubCategories 中的所有值转换为一个简单的字符串数组,并使用Contains 函数,查看当前 object.IDfromCategories 是否包含数组上的对象。这意味着我不会使用 for 循环。但在内部,我相信系统仍在使用循环,因此不会带来性能优势。

如果每个对象都包含另一个列表中的值,那么检查每个对象的最佳方法是什么?

【问题讨论】:

  • 您似乎只想检查allSubs 是否包含iDfromSubCategories == IDfromCategories 的条目,所以我会将所有iDfromSubCategories 转换为HashTable 并从快速查找中获利!
  • @Knoop 您的假设是正确的。哈希表?能举个例子吗?
  • 我想如果你一发现第一次出现就跳出内部循环,你会获得一些查找速度。
  • 其实这是个好主意!

标签: c# list


【解决方案1】:

您应该使用某种查找表。可能是HashSetDictionary。前者只允许检查集合中是否存在某个键,而后者还允许您找到该键所属的对象。

要检查与 SubCategories 共享 id 的所有 UserInsideCategories,您可以这样写:

var dict = subCategoriesList.ToDictionary(s => s.subCategoryID, s => s);
var matches = userInsideCategoriesList.Where(l => dict.ContainsKey(l.iDfromSubCategories));

如果你想要匹配的对,你可以写:

foreach (var user in userInsideCategoriesList)
{
    if (dict.TryGetValue(user.iDfromSubCategories, out var subCategory))
    {
        // Handle matched pairs
    }
}

这假定 ID 在相应列表中是唯一的。如果您有重复项,则需要多值字典之类的东西。没有内置多值字典,但如果您搜索一下,我希望会有一些实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多