Fastest way to find common items across multiple lists in C#

后端 未结 11 1973

Given the following:

List> optionLists;

what would be a quick way to determine the subset of Option objects that a

11条回答
  •  旧时难觅i
    2021-01-19 02:54

    @Skizz The method is not correct. It returns also items that are not common to all the lists in items. Here is the corrected method:

    /// .
        /// The method FindAllCommonItemsInAllTheLists, returns a HashSet that contains all the common items in the lists contained in the listOfLists,
        /// regardless of the order of the items in the various lists.
        /// 
        /// 
        /// 
        /// 
        public static HashSet FindAllCommonItemsInAllTheLists(List> listOfLists)
        {
            if (listOfLists == null || listOfLists.Count == 0)
            {
                return null;
            }
            HashSet currentCommon = new HashSet();
            HashSet common = new HashSet();
    
            foreach (List currentList in listOfLists)
            {
                if (currentCommon.Count == 0)
                {
                    foreach (T item in currentList)
                    {
                        common.Add(item);
                    }
                }
                else
                {
                    foreach (T item in currentList)
                    {
                        if (currentCommon.Contains(item))
                        {
                            common.Add(item);
                        }
                    }
                }
                if (common.Count == 0)
                {
                    currentCommon.Clear();
                    break;
                }
                currentCommon.Clear(); // Empty currentCommon for a new iteration.
                foreach (T item in common) /* Copy all the items contained in common to currentCommon. 
                                            *            currentCommon = common; 
                                            * does not work because thus currentCommon and common would point at the same object and 
                                            * the next statement: 
                                            *            common.Clear();
                                            * will also clear currentCommon.
                                            */
                {
                    if (!currentCommon.Contains(item))
                    {
                        currentCommon.Add(item);
                    }
                }
                common.Clear();
            }
    
            return currentCommon;
        }
    

提交回复
热议问题