C# 在对象列表上使用点运算符调用方法

C# 在对象列表上使用点运算符调用方法,c#,list,C#,List,我对C比较陌生,在我的作业中,我被要求创建一个对象列表: var A = new List<ObjectName>; 在处理列表时,我如何做同样的事情?如果我听起来不清楚,我想得到调用函数Add的整个列表以及作为参数传递的整个列表B EDIT:Add只是一个示例,因为它很容易演示基本数据类型。我没有添加任何内容,我只想访问同一个函数中的调用方列表和传递列表,该函数由点运算符调用。要使对象值总和使用System.Linq命名空间。 在using块中输入'System.Linq'。在你

我对C比较陌生,在我的作业中,我被要求创建一个对象列表:

var A = new List<ObjectName>;
在处理列表时,我如何做同样的事情?如果我听起来不清楚,我想得到调用函数Add的整个列表以及作为参数传递的整个列表B


EDIT:Add只是一个示例,因为它很容易演示基本数据类型。我没有添加任何内容,我只想访问同一个函数中的调用方列表和传递列表,该函数由点运算符调用。

要使对象值总和使用System.Linq命名空间。 在using块中输入'System.Linq'。在你的程序中。 这是一个非常有用的图书馆。此处信息链接

“Union”创建一个通用集合,删除重复项并汇总对象的值。 “Concat”是一个简单的通用集合,包括所有元素

    public int MakeSumWithoutDuplications(List<ObjectName> a, List<ObjectName> b)
    {
        return a.Union(b).Sum(x => x.Value);
    }

    public int MakeGeneralSum(List<ObjectName> a, List<ObjectName> b)
    {
        return a.Concat(b).Sum(x => x.Value);
    }
如何在ObjectName类中实现这样的方法

你不能。该方法在列表上工作,您在类中所做的任何操作都不会改变这一点。我强烈建议你让你的老师澄清这一点

您可以通过添加扩展方法来编译语法:

public static class ListOfObjectNameExtension
{
    public static int Add(this List<ObjectName> a, List<ObjectName> b)
    {
        // no idea what the result should actually be...
        return 42;
    }
}
现在将编译,因为我们扩展了列表,使其具有.Add方法


但是,我确信这不是你的老师想要的,请让他们澄清这项任务。

你的意思还不完全清楚,但我猜,你想把列表A中每个项目的.Value值的总和添加到列表B中的.Value属性的总和

为此,您可以为列表编写扩展方法:

public static class ListExtensions
{
    public static int SomeAddOperation(this List<ObjectName> listA, List<ObjectName> listB)
    {
        int sumA = 0;
        foreach(var someObject in listA)
        {
            sumA += someObject.Value;
        }

        int sumB = 0;
        foreach(var someObject in listB)
        {
            sumB += someObject.Value;
        }        

        return sumA + sumB;
    }
}
然后,你这样称呼它:


int sum=A.SomeAddOperationB

搜索运算符重载:+在您的情况下,如果您想将B附加到A,您可以使用内置的AddRange。顺便说一句,您的第一行代码无效。他不是指列表。添加为,将项目添加到列表中。他只是用Add作为一个操作的一般例子,不知道Add实际上是列表中的一个成员。好吧,你问的不清楚。因此,我将尝试用古老的比喻来澄清。你有两个鞋盒A和B,里面有一些钱A=新的[]{1,5,10}和B=新的[]{2,20,50}。通过A.AddB;,你希望sum是一个盒子,里面装着另一个盒子里的钱,对吗?因为变量sum是int,这意味着在我的示例中它应该是88。当你把它们加在一起时,两个框的总和。我明白了,所以列表不能有点运算符调用的方法,对吗?作业提示表明,这一部分让我感到困惑。老实说,我认为扩展方法很有可能成为练习的重点。没有它们,我看不出有什么方法可以做到这一点。列表可以有自己的方法,由点运算符调用,这适用于所有对象,这对列表来说并不特殊。如果要像调用类方法一样调用方法,则需要扩展方法。或者访问类的源代码来修改它。我认为这里有一个误解。注释“如何在ObjectName类中实现这样的方法”不适合OP发布的任何代码。对我来说,它只是看起来像一个。AddRangeB@ArcherA.AddRangeB不返回int。为什么要删除重复项?此外,如果ObjectName不重写Equals+GetHashCode,则不会删除它们。这里有太多的假设,我在问题中看不到。你指的是Concat,不是Union。@TimSchmelter,这是另一个问题。假设他使用唯一的值:@IuriiMaksimov:那么,不管怎样,也不需要额外的开销,使用Concat
public static class ListOfObjectNameExtension
{
    public static int Add(this List<ObjectName> a, List<ObjectName> b)
    {
        // no idea what the result should actually be...
        return 42;
    }
}
int sum = A.Add(B);
public static class ListExtensions
{
    public static int SomeAddOperation(this List<ObjectName> listA, List<ObjectName> listB)
    {
        int sumA = 0;
        foreach(var someObject in listA)
        {
            sumA += someObject.Value;
        }

        int sumB = 0;
        foreach(var someObject in listB)
        {
            sumB += someObject.Value;
        }        

        return sumA + sumB;
    }
}