以下是示例代码:
pets
完整的代码可以在这里找到:https://pastebin.com/raw/uB2B7A9g
此代码的输出不是我预期的。
我原以为: 靴子 布拉德利 晶须
但实际输出是: 晶须 靴子 布拉德利
不是pets
只是指针吗?
因此,如果我将petsList
添加到pets
,然后修改petsList[0]
,那么petsList[0]
应该指向已修改的变量吗?
但事实并非如此,pets
指向未经修改的List<List<Pet>> petsList = new List<List<Pet>>();
List<Pet> pets = new List<Pet>()
{
new Pet {Name = "Whiskers"},
new Pet {Name = "Boots"},
new Pet {Name = "Bradley"},
};
pets = pets.OrderBy(pet => pet.Name).ToList();
petsList.Add(pets);
foreach (Pet pet in petsList[0])
{
Console.WriteLine("{0}", pet.Name);
}
变量。
解决此问题的唯一方法是:
<input type="text" ng-model="Amount"/>
app.directive("editor", function(){
return {
restrict: "A",
require: 'ngModel',
link: function (scope, element, attrs) {
element.onblur('blur', function (e) {
alert('as')
// i want text box value here
return (value).toFixed(2);
});
}
}
};
});
答案 0 :(得分:2)
问题不在于Add()
之后引用的相等性。
如果您为参考平等添加此检查,您将看到问题所在:
petsList.Add(pets);
Console.WriteLine(object.ReferenceEquals(petsList[0],pets)); // true
pets = pets.OrderBy(pet => pet.Name).ToList();
Console.WriteLine(object.ReferenceEquals(petsList[0], pets)); // false
当您撰写pets = pets.OrderBy(pet => pet.Name).ToList();
时,您正在更改pets
被绑定的引用,之后petsList[0
]和pets
不再等于引用。因此,您还需要将petsList[0]
设置为该新引用。
答案 1 :(得分:2)
不是宠物只是指针吗?
是的,pets
是引用类型
所以,如果我将宠物添加到petsList,然后修改宠物,那么 petsList [0]应该指向修改后的变量?
如果您“修改宠物”,请更正
但是行pets.OrderBy(pet => pet.Name).ToList();
不会修改现有的集合,而是会返回List<Pet>
的新实例。
因此,在您的示例中petsList[0]
仍将引用原始集合,其中pets
在订购后将引用新集合。
要修改现有集合,可以使用List.Sort方法,但由于集合是Pet
类型的集合 - 您需要为此类型创建自定义比较器。没有自定义比较器项目将按引用进行排序。