我有一个对象的List(在C#中)(我创建的类).我能够使用列表,但问题是我只创建(实例化我认为是正确的术语)我的一个对象类,并且我继续将它添加到列表中,即使该对象的属性随着代码的迭代而改变.我希望能够将硬编码对象添加到我的列表而不是参考对象.
这是我目前正在做的事情:
public class SaveData
{
public double save_property1;
public double save_property2;
}
in the application
SaveData newSaveData = new SaveData();
List<SaveData> newSaveDataList = new List<SaveData>;
if ( some condition)
{
newSaveData.save_property1 = x
}
if (some condition 2)
{
newSaveData.save_property2 = y
newSaveDataList.Add(SaveData); //
}
Run Code Online (Sandbox Code Playgroud)
由于X和Y在迭代中发生变化,我希望SaveDate我添加到列表中的对象不会随着每次迭代而改变(因此我可以保留Data对象的历史记录),即硬编码而不是用作参考.
我基本上有一个字典列表,例如:
List<Dictionary<string, string>>
Run Code Online (Sandbox Code Playgroud)
为了测试的目的,我将 36 个字典项目提取到列表中,然后在函数末尾返回该列表。
奇怪的是,当我填充列表时,我可以看到字典的 Key=>Value 对被添加到 Visual Studio 检查器中的列表中,但是在清除用于填充列表的原始字典后,剩下的只有 36列表中的空项目。
是否发生了一些我不知道的奇怪的列表行为?下面包含代码片段以供参考...
List<Dictionary<string, string>> allResults = new List<Dictionary<string, string>>();
Dictionary<string, string> selectResult = new Dictionary<string, string>();
MySqlCommand cmd = new MySqlCommand(query, conn);
MySqlDataReader dataReader = cmd.ExecuteReader();
try
{
while (dataReader.Read())
{
for (int i = 0; i < dataReader.FieldCount; i++)
{
selectResult.Add(dataReader.GetName(i).ToString(), dataReader.GetValue(i).ToString());
}
allResults.Add(selectResult);
//Something to do with this next line seems to cause the List to also lose the values stored in the Dictionary, is clearing …Run Code Online (Sandbox Code Playgroud) 我需要来自另一个位图的位图的深层副本。现在,大部分的解决方案,说像这样,这不是一个深拷贝。这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅表副本。现在以下似乎对我有用,但我不确定这是否适用于所有情况。
public static Bitmap GetCopyOf(Bitmap originalImage)
{
Rectangle rect = new Rectangle(0, 0, originalImage.Width, originalImage.Height);
Bitmap retrunImage = new Bitmap(originalImage.Width, originalImage.Height, originalImage.PixelFormat);
BitmapData srcData = originalImage.LockBits(rect, ImageLockMode.ReadOnly, originalImage.PixelFormat);
BitmapData destData = retrunImage.LockBits(rect, ImageLockMode.WriteOnly, originalImage.PixelFormat);
int dataLength = Math.Abs(srcData.Stride) * srcData.Height;
byte[] data = new byte[dataLength];
Marshal.Copy(srcData.Scan0, data, 0, data.Length);
Marshal.Copy(data, 0, destData.Scan0, data.Length);
destData.Stride = srcData.Stride;
if (originalImage.Palette.Entries.Length != 0)
retrunImage.Palette = originalImage.Palette;
originalImage.UnlockBits(srcData);
retrunImage.UnlockBits(destData);
return retrunImage;
}
Run Code Online (Sandbox Code Playgroud)
我需要更好,更优雅的方式来做到这一点。否则,只需指出上述代码可能会失败的一些情况。TIA
编写一个asp.net mvc应用程序,我有这样的东西......
Public Class AA
'... has some variables...
End Class
Public Class BB
Inherits AA
Public ExtraVariable As Integer ' just adds another variable and thats it!
End Class
Run Code Online (Sandbox Code Playgroud)
那么,现在在我的程序中,我只想将类型AA的对象复制到BB类型的空变量中?
这样做是有意义的,因为我希望AA类型对象中的所有字段都被复制到新创建的BB类型对象,而BB类型对象中的ExtraVariable我将(稍后)只为它分配一个值(之后)副本)在我自己的时间!
我知道将BB类型复制到AA类型是不合适的,因为会丢失数据!
但是我试图将AA复制到BB,我已经使用了两个DirectCast并且CType这样做,并且我一直"无法施放"错误!
注意:我正在使用vb.net(但可以读取c#,没问题)
我正在使用winforms与visual studio 2008.
我想用控件和所有事件创建一个我的表单的EXACT副本,以及我所拥有的所有相同代码.
这可以在运行时做吗?我该怎么办?
不应该有某种类解决方案,如:
Form form2 = new Form();
form2 = form1 ???
Run Code Online (Sandbox Code Playgroud) 我有:
instance1 = instance2;
Run Code Online (Sandbox Code Playgroud)
如何将它们彼此断开,以便改变一个不会影响另一个?
编辑:我希望他们引用相同的对象(所以我不能克隆),后来 - 不是.但我仍然想要这个类的两个实例 - 所以我不能'空'它们.
谢谢
编辑:
myclass a = new myclass();
a.integer = 1;
myclass b = new myclass();
b.integer = 2;
a = b;
//All changes to one will affect the other, Which is what I want.
//<More lines of the program>
//Now I want 'a' to point to something else than 'b'. and I’m missing the code
//so that the next line will not affect 'b'.
a.integer = 1;
Text = b.integer.ToString(); …Run Code Online (Sandbox Code Playgroud) 我需要存储两个变量,然后检查它们是否没有改变.
List<CatalogInfo> list_catalogs = new List<CatalogInfo>();
List<FileInfo> list_files = new List<FileInfo>();
List<CatalogInfo> list_catalogs_for_check_changed = new List<CatalogInfo>();
List<FileInfo> list_files_check_changed = new List<FileInfo>();
Run Code Online (Sandbox Code Playgroud)
当我做:
list_catalogs_for_check_changed = list_catalogs;
list_files_check_changed = list_files;
Run Code Online (Sandbox Code Playgroud)
但是当我添加到list_catalogs或list_files项目时,我在debager中看到Items添加到list_catalogs_for_check_changed或list_files_check_changed.为什么???我没有用变量添加项目.
list_catalogs.Add(new CatalogInfo() { Action = "Create", Path = folderBrowserDialog1.SelectedPath });
Run Code Online (Sandbox Code Playgroud) 类示例:
public class Customer
{
public int CustomerID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用班级:
Customer customer1 = new Customer();
customer1.CustomerID = 1;
Run Code Online (Sandbox Code Playgroud)
现在,我如何创建一个customer2类,其中包含存储在customer1中的所有值?
在Suzanne Cook的.NET CLR Notes中,她谈到了“ LoadFrom”上下文的危险。特别,
- 如果Load上下文程序集尝试按显示名称加载此程序集,则默认情况下将找不到它(例如,当mscorlib.dll反序列化此程序集时)
- 更糟糕的是,在探测路径上可能会找到具有相同标识但路径不同的程序集,从而导致稍后导致InvalidCastException,MissingMethodException或意外的方法行为。
如何在不显式加载程序集的两个不同版本的情况下通过反序列化来重现此行为?
我有一个我创建的视图模型,然后返回到我的视图.此视图模型未缓存.但是,视图模型包含缓存的类型"类别"列表.
我做通常的"如果在缓存中检索并返回.如果不在缓存中则检索数据,存储在缓存中并将视图模型返回到控制器.这按预期工作.
我的问题就在我将视图模型从我的控制器返回到我的视图之前我想更新我的类别列表中的记录,但仅针对调用它的页面(不是所有用户/页面调用它).当我这样做时,它会自动更新缓存中的类别列表,我不希望它.我只插入一次缓存,所以不明白为什么当我从缓存中检索它后更新列表时,更改会立即反映在缓存中.
这可能是我误解了OO/Cache是如何工作的,但我希望有人可以让我直截了当吗?
我控制器中的代码......
var vm = new FsmViewModel();
if(vm.ActiveCategoryId > 0)
vm.Categories.Find(c => c.Category_ID == vm.ActiveCategoryId).ActiveBootstrapCss = "active";
Run Code Online (Sandbox Code Playgroud)
上面的代码还更新了我在缓存中存储的类别列表?我正在使用代理模式从缓存或数据库填充类别列表.
ObjectCache cache = MemoryCache.Default;
_categories = (List<Category>)cache[CacheForCategories];
if (_categories != null) return _categories;
// Cache does not exist so create
var policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddHours(4)};
_categories = base.GetAllCategories();
cache.Add(CacheForCategories, _categories, policy);
return _categories;
Run Code Online (Sandbox Code Playgroud)
_categories返回到从缓存或db中提取的视图模型,并在我的视图模型对象中定义为
public List<Category> Categories { get; set; }
Run Code Online (Sandbox Code Playgroud)
有人可以让我知道我在这里做错了什么吗?
谢谢,
保罗