Ale*_*lex 6 c# linq outer-join
我有两个具有这种类型的IQueryable集合
public class Property  
{  
   public string Name {get; set;}  
}
集合1,具有以下名称值:
A  
A  
A  
B  
集合2,具有以下名称值:
A  
B  
B
我想得到的是第三个集合,其中集合1和2的名称值匹配,如果没有匹配,则null (empty)如下:  
Result Collection:  
A     A
A     null  
A     null  
B     B  
null  B
如何用C#,LINQ实现这一目标?
using System;
using System.Collections.Generic;
using System.Linq;    
namespace Testing
{
    public class Property
    {
        public string Name { get; set; }
        public override bool Equals(object obj)
        {
            var item = obj as Property;
            if (item == null)
            {
                return false;
            }
            return item.Name == Name;
        }
        public override int GetHashCode()
        {
            return Name.GetHashCode();
        }
    }
    public class JoinedProperty
    {
        public Property Name1 { get; set; }
        public Property Name2 { get; set; }
        public override string ToString()
        {
            return (Name1 == null ? "" : Name1.Name)
                + (Name2 == null ? "" : Name2.Name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var list1 = new List<Property>
            {
                new Property{ Name = "A" },
                new Property{ Name = "A" },
                new Property{ Name = "A" },
                new Property{ Name = "B" }
            };
            var list2 = new List<Property>
            {
                new Property{ Name = "A" },
                new Property{ Name = "B" },
                new Property{ Name = "B" }
            };
            var allLetters = list1.Union(list2).Distinct().ToList();
            var result = new List<JoinedProperty>();
            foreach (var letter in allLetters)
            {
                var list1Count = list1.Count(l => l.Name == letter.Name);
                var list2Count = list2.Count(l => l.Name == letter.Name);
                var matchCount = Math.Min(list1Count, list2Count);
                addValuesToResult(result, letter, letter, matchCount);
                var difference = list1Count - list2Count;
                if(difference > 0)
                {
                    addValuesToResult(result, letter, null, difference);                   
                }
                else
                {
                    difference = difference * -1;
                    addValuesToResult(result,null, letter, difference);                   
                }
            }
            foreach(var res in result)
            {
                Console.WriteLine(res.ToString());
            }
            Console.ReadLine();                
        }
        private static void addValuesToResult(List<JoinedProperty> result, Property letter1, Property letter2, int count)
        {
            for (int i = 0; i < count; i++)
            {
                result.Add(new JoinedProperty
                {
                    Name1 = letter1,
                    Name2 = letter2
                });
            }
        }
    }
}
运行这个,你会得到结果
AA
A
A
BB
B
结果列表的内容就是您想要的。
编辑:更新了我的答案以使用指定的属性。