我只是看着Eric Lippert对不可变二叉树的简单实现,我对此有疑问.在显示实施后,Eric说明了这一点
请注意,不可变数据结构的另一个不错的功能是不可能(或故意!)创建包含循环的树.
似乎Eric的实现的这个特征不是仅仅来自不变性,而是来自树从树叶构建的事实.这自然会阻止节点将其任何祖先作为子节点.似乎如果你在另一个方向上构建了树,你就会引入循环的可能性.
我是否正确思考,或者在这种情况下循环的不可能性是否来自于不变性?考虑到来源,我想知道我是否遗漏了一些东西.
编辑:经过多思考后,似乎从叶子构建可能是创建不可变树的唯一方法.我对吗?
我正在开发一个需要传递大量Int32值的应用程序.这些集合应包含~1,000,000-50,000,000项目,其中每个项目都是该范围内的数据库键0-50,000,000.我希望任何给定集合中的id分布在这个范围内是有效随机的.我需要的操作很简单:
关于这些集合的内存使用情况存在严重问题,因此我正在寻找一种能够比简单List<int>或更高效地存储id的数据结构HashSet<int>.我看过了BitArray,但这可能是浪费,取决于ID的稀疏程度.我也考虑过一点点trie,但我不确定如何计算该解决方案对于预期数据的空间效率.Bloom Filter会很棒,只要我能容忍假阴性.
我将不胜感激任何适用于此目的的数据结构的建议.我对开箱即用和定制解决方案感兴趣.
编辑:回答你的问题:
我正在尝试流畅的扩展方法.
我有以下简单的扩展方法来执行安全转换.
public static T As<T>(this Object source)
where T : class
{
return source as T;
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但是当我尝试使用带有重载的valuetypes直观时
public static T As<T>(this ValueType source)
where T : struct
{
return (T)source;
}
Run Code Online (Sandbox Code Playgroud)
我遇到了问题.方法解析逻辑总是选择上面的第一种方法,并给出结构不是类的语法错误(准确).
有没有办法处理上述问题,或者我是否应该在同一方法中测试和处理所有类型时采用删除约束的路径?
====编辑:回答问题====
我正在针对3.5框架编译这个.我并不是真的想要完成任何事情; 这只是上面的一个实验.我的兴趣被激发了,我把一些代码汇总在一起.
我并不特别担心它仍然是一个"安全"演员.这就是它的开始,并且可以使用default()保持安全 - 但这并不是问题和代码的重点,以确保"安全性"只是模糊不清.
至于表现力,没有value.As<int>()比表达更具表现力(int)value; 但为什么方法的用户必须"只知道"它只适用于引用类型?我尝试使用它更多的是关于方法的预期行为而不是表达性写作.
代码片段value.As<DateTime>()给出错误"类型'System.DateTime'必须是引用类型,以便在泛型类型或方法中使用它作为参数'T'.作为(对象)".从错误消息我看到它正在解决使用上面的top方法,因为它是需要引用类型的方法.
为什么以下代码不产生输出?
static void Main(string[] args)
{
FieldInfo[] fi = typeof(MyStruct).GetFields(BindingFlags.Public);
foreach (FieldInfo info in fi)
{
Console.WriteLine(info.Name);
}
}
public struct MyStruct
{
public int one;
public int two;
public int three;
public int four;
public int five;
public int six;
public bool seven;
public String eight;
}
Run Code Online (Sandbox Code Playgroud) 我的应用程序正在从WMI接收一些日期信息.这是字符串形式,格式如下:
yyyymmddHHMMSS.mmmmmmsUUU
Run Code Online (Sandbox Code Playgroud)
有关此格式的更多详细信息,请参见此处.我对在此期间之前解析所有内容感兴趣.我有以下代码:
string testDate = "20010701212212"; // July, 01, 2001 21:22:12, in the format specified above
string format = "yyyyMMddHHmmSS";
CultureInfo culture = CultureInfo.InvariantCulture;
DateTime newDate = DateTime.ParseExact(date, format, culture);
Run Code Online (Sandbox Code Playgroud)
这总是在调用ParseExact()时失败,但有一个例外,指出"String未被识别为有效的DateTime".我在这做错了什么?
在我工作地点的ASP.net站点上,以下代码块负责处理文件下载(注意:此处未使用Response.TransmitFile,因为下载的内容是从zip文件流式传输的):
private void DownloadFile( Stream stream)
{
int bytesRead;
int chunkSize = 1048576; //1MB
byte[] readBuffer = new byte[chunkSize];
while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) != 0)
{
if(!Response.IsClientConnected)
break;
byte[] chunk = new byte[bytesRead];
Array.Copy(readBuffer,0,chunk,0,bytesRead);
Response.BinaryWrite(chunk);
Response.Flush();
}
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
我们的用户经常下载数百MB的文件,这可以很快地咀嚼服务器内存.我的假设是这是由于响应缓冲.那有意义吗?
我刚刚读到了Response对象的'buffer'属性.如果我将其设置为false,是否会阻止Response.BinaryWrite()调用缓冲内存中的数据?一般来说,在这种情况下限制内存使用的好方法是什么?也许我应该从zip流式传输到临时文件,然后调用Response.TransmitFile()?
编辑:除了可能的解决方案,我对上面代码中存在的内存使用问题的解释非常感兴趣.为什么这会消耗远远超过1MB,即使在每次循环迭代时调用Response.Flush?它只是在每次循环迭代时发生的不必要的堆分配(并且不会立即得到GC),或者还有其他工作吗?
我注意到byte在C#中对s 使用按位XOR运算符有些奇怪.至少对我来说很奇怪.
byte a = 0x11;
byte b = 0xAA;
a ^= b; // works
a = a ^ b; // compiler error: Cannot implicitly convert type "int" to "byte"
Run Code Online (Sandbox Code Playgroud)
我也看到这个问题使用short,但不是int或long.
我认为最后两行是等价的,但似乎并非如此.这里发生了什么?
我为盒装的RegistryItem对象定义了以下IComparer:
public class BoxedRegistryItemComparer : IComparer<object>
{
public int Compare(object left, object right)
{
RegistryItem leftReg = (RegistryItem)left;
RegistryItem rightReg = (RegistryItem)right;
return string.Compare(leftReg.Name, rightReg.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
我想用它来对盒装的RegistryItems的ArrayList进行排序(它确实应该是一个List <RegistryItem>,但这不受我的控制).
ArrayList regItems = new ArrayList();
// fill up the list ...
BoxedRegistryItemComparer comparer = new BoxedRegistryItemComparer();
ArrayList.sort(comparer);
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出了编译器错误:"无法从BoxedRegistryItemComparer转换为System.Collections.IComparer".如果有人能指出我的错误,我将不胜感激.
在我的工作地点,我们有一个ASP.NET页面,它使用以下代码来执行文件下载.我们使用它而不是Request.TransmitFile(),因为该文件直接来自zip存档.
private void DownloadStream(Stream stream)
{
int bytesRead;
int chunkSize = 1048576; //1MB
byte[] readBuffer = new byte[chunkSize];
while ( (bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) > 0)
{
if (!Response.IsClientConnected)
break;
Response.OutputStream.Write(readBuffer, 0, bytesRead);
Response.Flush();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试确定httpRuntime executionTimeout设置的合理值.正在发送的文件范围高达1GB的大小,和我们的某些用户有非常慢的管道*的网络服务器(64K思行).我们不希望这些用户体验连接重置.但是,我们希望为站点的其余部分保留合理的超时值.
有没有办法只为这个特定的页面定义一个executionTimeout设置(或者甚至专门为该页面设置它)?推荐的方法是什么?我知道我们可能最好使用一种完全不同的方法来提供文件(例如FTP),但我们没有自由选择.我们所能做的就是修改网站的代码.
此外,我确实认为这些下载应该在发送之前进行压缩,但这是另一回事.
*题外话题:"慢管"是一个令人讨厌的混合比喻吗?我应该说"小管",但在这种情况下,这听起来很奇怪.意见?
我有许多页面需要支持将数据导出到Excel电子表格.我可以很好地生成Excel文件,但我正在尝试弄清楚如何抽象这种行为,以便它可以从我需要的所有页面轻松地重用.我目前的想法是使用静态实用方法,如下所示:
public static void SendExcelFile(System.Web.UI.Page callingPage, string downloadFileName, List<List<string>> data, string worksheetTitle)
{
string tempFileName = Path.GetTempFileName();
try
{
// Generate file using ExcelPackage
GenerateExcelDoc(tempFileName, data, worksheetTitle);
callingPage.Response.AddHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
callingPage.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
callingPage.Response.AddHeader("Content-Length", new FileInfo(tempFileName).Length.ToString());
callingPage.Response.TransmitFile(tempFileName);
}
finally
{
//When this is removed, the method works as expected.
if (File.Exists(tempFileName))
File.Delete(tempFileName);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在调用的单击处理程序SendExcelFile如下所示:
protected void lnkExport_Click(object sender, EventArgs e)
{
List<List<string>> dataList = GatherDataForSpreadsheet();
Utility.SendExcelFile(this, "fileNameForDownload.xlsx", dataList, "MyReports");
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以很好地作为调用页面的实例方法.但是,作为静态方法,它根本不起作用.当我单击调用此按钮时,浏览器会无限期地显示加载动画,但从不提示文件下载.
我对ASP.NET(以及一般的Web编程)很新,所以我确定我在这里遗漏了一些东西.有人可以解释一下我所看到的行为,并建议一种合理的替代方法吗?
编辑:如果我最后删除对File.Delete()的调用,该方法按预期工作.Response.TransmitFile()是否异步进行传输?
编辑2:我只需要在删除文件之前调用Response.Flush().请参阅下面的答案.谢谢!
c# ×8
asp.net ×3
algorithm ×2
response ×2
constraints ×1
datetime ×1
generics ×1
httpruntime ×1
icomparer ×1
immutability ×1
reflection ×1
tree ×1