【问题标题】:Affect an ICollection that is passed to a method as a parameter?影响作为参数传递给方法的 ICollection?
【发布时间】:2023-03-21 22:37:01
【问题描述】:

我有一个具有ICollection 属性的类,该属性在类被实例化时由构造函数分配,但我想将此属性绑定到原始集合,以便在更新/更改时,原始列表为出色地。这样做的最佳方法是什么?

这是一个例子:

public class Organizations
{
    private ICollection<Organization> _orgs;

    public Organizations(ICollection<Organization> orgs)
    {
        _orgs = orgs;
    }

    public void TestAdd()
    {
        _orgs.Add(new Organization {Name = "Testing 123"});
    }
}


// in another class
public ActionResult TestApi()
{
    var tmp = new SyncTool.Core.Extensions.Zendesk.Organizations(ZendeskCache.Organizations.Data);
    var zd = ZendeskCache.Organizations.Data.FirstOrDefault(n => n.Name.Contains("Testing 123"));

    //ZendeskCache.Org.... is a List<Organization>

    return Json(new {data = "tmp" }, AG);
}

【问题讨论】:

  • 有什么问题?这不工作吗?
  • 正确,以上行不通。该列表不包含添加的项目。
  • 这段代码似乎没有问题。访问.First()时会抛出异常吗?你怎么知道它不起作用?
  • 我在我的代码中使用FirstOrDefault,它返回null。我将使用更全面的示例更新 OP。
  • 也许ZendeskCache.Organizations.Data 每次都会返回一个新集合?尝试将其放入像 var collection = ZendeskCache.Organizations.Data; 这样的变量中,然后使用 collection 变量作为 Organizations 的构造函数参数,并在测试它包含“Testing `12”值时使用。

标签: c# linq inheritance collections


【解决方案1】:

您传递给构造函数的List&lt;Organization&gt; 是一个引用对象。这段代码按照你想要的方式工作(除了语法错误),你试过了吗?

更简单地重现:

public class Program
{
    public static void Main(string[] args)
    {
        var orgs = new List<string>();
        var orgClass = new Organizations(orgs);
        orgClass.TestAdd();
        Console.WriteLine(orgs.First());
        Console.Read();
    }
}

public class Organizations
{
    private ICollection<string> _orgs;

    public Organizations(ICollection<string> orgs)
    {
        _orgs = orgs;
    }

    public void TestAdd()
    {
        _orgs.Add("Testing 123");
    }
}

//Output: "Testing 123"

【讨论】:

  • 我试图简化我的代码以显示一个示例,但它确实将项目添加到原始列表中。
  • 如果您曾经重新分配_orgs,即_orgs = new List...,那么它们将不会引用同一个对象。不过,这只是对您的问题的猜测。
  • 我已经用一个稍微好一点的例子更新了原始代码,但它是一个非常简单的例子。
  • 其实,我只是粗心。我很抱歉。在我的生产代码中,我调用的是构造函数,而不是类中的方法。愚蠢的疏忽。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多