惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
T
Threatpost
aimingoo的专栏
aimingoo的专栏
博客园_首页
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
Security Latest
Security Latest
T
Tailwind CSS Blog
The Hacker News
The Hacker News
P
Palo Alto Networks Blog
Latest news
Latest news
G
GRAHAM CLULEY
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
InfoQ
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 叶小钗
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
S
SegmentFault 最新的问题
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
罗磊的独立博客
博客园 - 聂微东
Simon Willison's Weblog
Simon Willison's Weblog
Scott Helme
Scott Helme
T
Tenable Blog
O
OpenAI News
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
美团技术团队

博客园 - sdxd.bgl

将SQL Server中的数据显示到SharePoint中 拓展训练总结 在PowerShell中,如何获取SharePoint的默认数据库服务器 在SharePoint页面中如何显示来自其他网站的List 恢复导出XSLT List View WebPart 实战部署FAST Search Server 2010 for SharePoint Sharepoint开发中代码运行权限级别 在InfoPath中如何获取当前用户的信息(Profile) 晒晒我的家乡 关于模式的思考 小心委托 利用System.Linq.Expressions实现四则运算计算器(三) 利用System.Linq.Expressions实现四则运算计算器(二) 利用System.Linq.Expressions实现四则运算计算器(一) 初识System.Linq.Expressions 如何实现Windows服务 用javascript实现下拉列表的自动筛选功能 - sdxd.bgl - 博客园 我的生活 电脑是个神奇的东西!
请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?
sdxd.bgl · 2007-04-07 · via 博客园 - sdxd.bgl

请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?

请看下面的代码。

using System;
using System.Collections.Generic;namespace Juxiantang
{
    
public static class CollectionOperate
    {
        
/// <summary>
        
/// 对两个已排序的集合进行分解合并操作
        
/// a中独有的存放在c.A中
        
/// a,b都有的存放在c.AB中
        
/// b中独有的存放在c.B中
        
/// </summary>
        
/// <typeparam name="T">必须是可以比较的类型</typeparam>
        
/// <param name="a">集合a</param>
        
/// <param name="b">集合b</param>
        
/// <returns>返回c(A, AB, B)</returns>
        public static ThreeCollection<T> BreakUpSortedCollection<T>(IEnumerable<T> a, IEnumerable<T> b)
            where T : IComparable
<T>
        {
            IEnumerator
<T> ia = a.GetEnumerator();
            IEnumerator
<T> ib = b.GetEnumerator();
            ThreeCollection
<T> c = new ThreeCollection<T>();
            
if (!ia.MoveNext()) //a集合为空
            {
                c.B.AddRange(b);
                
return c;
            }
            
if (!ib.MoveNext()) //b集合为空
            {
                c.A.AddRange(a);
                
return c;
            }
            
            ia.Reset();
            ib.Reset();
            ia.MoveNext();
            ib.MoveNext();
            Lookup
<T>(ia, ib, c.A, c.AB, c.B);
            
return c;
        }
/// <summary>
        
/// 针对集合a的当前值a.Current,对比集合b的当前值b.Current
        
/// 根据对比情况将a.Current或b.Current放入A, AB, B中
        
/// </summary>
        
/// <typeparam name="T"></typeparam>
        
/// <param name="ia"></param>
        
/// <param name="ib"></param>
        
/// <param name="A"></param>
        
/// <param name="AB"></param>
        
/// <param name="B"></param>
        private static void Lookup<T>(IEnumerator<T> ia, IEnumerator<T> ib, List<T> A, List<T> AB, List<T> B)
            where T : IComparable
<T>
        {
            
int compareResult = (ia.Current.CompareTo(ib.Current));
            
if (compareResult < 0//a.Current < b.Current
            {
                A.Add(ia.Current);
                
if (ia.MoveNext())
                {
                    Lookup
<T>(ia, ib, A, AB, B);
                }
                
else
                {
                    
do
                    {
                        B.Add(ib.Current);
                    } 
while (ib.MoveNext());
                }
            }
            
else if (compareResult == 0//a.Current == b.Current
            {
                AB.Add(ia.Current);
                
if (!ia.MoveNext())
                {
                    
while (ib.MoveNext())
                    {
                        B.Add(ib.Current);
                    }
                }
                
else if (ib.MoveNext())
                {
                    Lookup
<T>(ia, ib, A, AB, B);
                }
            }
            
else // a.Current > b.Current
            {
                B.Add(ib.Current);
                
if (ib.MoveNext())
                {
                    Lookup
<T>(ib, ia, B, AB, A);
                }
                
else
                {
                    
do
                    {
                        A.Add(ia.Current);
                    } 
while (ia.MoveNext());
                }
            }
        }
    }
/// <summary>
    
/// 简单将A, AB, B集合在一起的实体
    
/// </summary>
    
/// <typeparam name="T">泛型</typeparam>
    public class ThreeCollection<T>
    {
        List
<T> a = new List<T>();
        List
<T> ab = new List<T>();
        List
<T> b = new List<T>();public List<T> B
        {
            
get { return b; }
            
set { b = value; }
        }
public List<T> AB
        {
            
get { return ab; }
            
set { ab = value; }
        }
public List<T> A
        {
            
get { return a; }
            
set { a = value; }
        }
    }
public class Program
    {
        
static void Main()
        {
            
int[] b = { 123456 };
            
int[] a = { 81011 };
            ThreeCollection
<int> c = CollectionOperate.BreakUpSortedCollection<int>(a, b);
            System.Console.Write(
"A = ");
            Print
<int>(c.A);
            System.Console.Write(
"AB = ");
            Print
<int>(c.AB);
            System.Console.Write(
"B = ");
            Print
<int>(c.B);
            System.Console.ReadLine();
        }
static void Print<T>(IEnumerable<T> list) where T : IFormattable
        {
            
foreach (T o in list)
            {
                System.Console.Write(o.ToString());
                System.Console.Write(
" ");
            }
            System.Console.Write(
"\n");
        }
    }
}