Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两个列表上执行正确的并集<;选择列表项>;_C#_.net_List_Union_Selectlistitem - Fatal编程技术网

C# 在两个列表上执行正确的并集<;选择列表项>;

C# 在两个列表上执行正确的并集<;选择列表项>;,c#,.net,list,union,selectlistitem,C#,.net,List,Union,Selectlistitem,此处声明了oldList和newList retval.AddRange(oldList.Union(newList)); List oldList=新列表(); List newList=新列表(); 我想合并这两个列表,删除具有相同“text”属性的重复项。如果text属性上的newList和oldList之间存在重复,则应保留newList的文本/值对 上面提到的工会除了把名单列在一起似乎什么也没做,不知道为什么 我做错了什么 我想合并这两个列表,删除具有相同“text”属性的重复项

此处声明了
oldList
newList

retval.AddRange(oldList.Union(newList));
List oldList=新列表();
List newList=新列表();
我想合并这两个列表,删除具有相同“text”属性的重复项。如果text属性上的newList和oldList之间存在重复,则应保留newList的文本/值对

上面提到的工会除了把名单列在一起似乎什么也没做,不知道为什么

我做错了什么

我想合并这两个列表,删除具有相同“text”属性的重复项

Union
方法不会处理此要求。您可以通过以下方式完成此操作:

List<SelectListItem> oldList = new List<SelectListItem>();
List<SelectListItem> newList = new List<SelectListItem>();
从阅读中可以看出,
A.Union(B)
实际上只是在
A
中添加了
B
中那些不在
A
中的项目。即:

当该对象返回时 方法枚举,联合枚举 按顺序排列的第一和第二,以及 生成每个尚未生成的元素 已经取得了成果

快速测试证明了这一点。因此,
oldList.Union(newList)
将保留旧值,而
newList.Union(oldList)
将提供新值

以下是我的测试代码:

retVal.AddRange(newList); // Since you want to keep all newList items, do this first

// Add in all oldList items where there isn't a match in new list
retVal.AddRange(oldList.Where(i => !newList.Any(n => i.Text == n.Text)));
类神话
{
公共字符串文本{get;private set;}
公共int版本{get;private set;}
公共神话(字符串t,int v)
{
Text=t;
版本=v;
}
公共覆盖int GetHashCode()
{
返回Text.GetHashCode();
}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null)
返回false;
虚构其他=对象为虚构;
如果(其他==null)
返回false;
返回此.Text.Equals(其他.Text);
}
}
静态列表oldList=新列表()
{
新神话(“福”,0),
新神话(“酒吧”,0),
新神话(“Fooby”,0),
};
静态列表newList=新列表()
{
新神话(“芭比”,1),
新神话(“酒吧”,1)
};
静态void DoIt()
{
var unionOldNew=oldList.Union(newList);
Console.WriteLine(“oldList.Union(newList)”);
foreach(unionOldNew中的var t)
{
Console.WriteLine(“{0},{1}”,t.Text,t.Version);
}
Console.WriteLine();
var unionNewOld=newList.Union(oldList);
Console.WriteLine(“newList.Union(oldList)”;
foreach(unionNewOld中的var t)
{
Console.WriteLine(“{0},{1}”,t.Text,t.Version);
}
}

@Reed:
newList.Union(oldList)
可以。看看我的回答。@Jim:只有当相等比较器按照OP预期的方式处理这个问题时。然而,根据他的陈述,比较器并没有做OP想要的比较。。。(这可能是在检查文本和值,而不仅仅是文本是否相等)。此查询的性能非常糟糕。正确的方法是构建哈希集或使用GroupJoin。@usr:同样,哈希集和GroupJoin的性能会更好,但需要不同的相等操作才能正常工作。您可以在newList上构建哈希集。选择(x=>x.Text);那么就不需要自定义比较器了。组联接也不需要它。这仅在类型中的Equals比较设置正确时有效。OP的类显然不是这样,因为他明确提到Union正在执行Concat(这意味着它不仅限于他的文本属性)
    class MyThing
    {
        public string Text { get; private set; }
        public int Version { get; private set; }

        public MyThing(string t, int v)
        {
            Text = t;
            Version = v;
        }

        public override int  GetHashCode()
        {
             return Text.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            MyThing other = obj as MyThing;
            if (other == null)
                return false;
            return this.Text.Equals(other.Text);
        }
    }

    static List<MyThing> oldList = new List<MyThing>()
    {
        new MyThing("Foo", 0),
        new MyThing("Bar", 0),
        new MyThing("Fooby", 0),
    };

    static List<MyThing> newList = new List<MyThing>()
    {
        new MyThing("Barby", 1),
        new MyThing("Bar", 1)
    };

    static void DoIt()
    {
        var unionOldNew = oldList.Union(newList);
        Console.WriteLine("oldList.Union(newList)");
        foreach (var t in unionOldNew)
        {
            Console.WriteLine("{0}, {1}", t.Text, t.Version);
        }
        Console.WriteLine();
        var unionNewOld = newList.Union(oldList);
        Console.WriteLine("newList.Union(oldList)");
        foreach (var t in unionNewOld)
        {
            Console.WriteLine("{0}, {1}", t.Text, t.Version);
        }
    }