我知道C#中实例化的值类型数组会自动填充类型的默认值(例如,对于bool为false,对于int为0等).
有没有办法使用不是默认值的种子值自动填充数组?之后是创建还是内置方法(比如Java的Arrays.fill())?假设我想要一个默认为true的布尔数组,而不是false.是否有内置的方法来执行此操作,或者您只需要使用for循环遍历数组?
// Example pseudo-code:
bool[] abValues = new[1000000];
Array.Populate(abValues, true);
// Currently how I'm handling this:
bool[] abValues = new[1000000];
for (int i = 0; i < 1000000; i++)
{
abValues[i] = true;
}
Run Code Online (Sandbox Code Playgroud)
必须遍历数组并将每个值"重置"为true似乎是无效的.有没有办法解决?也许通过翻转所有价值观?
在输出这个问题并思考之后,我猜测默认值只是C#如何在幕后处理这些对象的内存分配的结果,所以我想这可能不可能做到这一点.但我仍然想知道!
我有一个ListView控件,它表现出奇怪的行为 - 在回发后行只是部分更新.我希望这里有人可以解释为什么会出现这种情况.
我的listview DataSource绑定到存储在页面会话状态中的项列表.这是故意的,部分是为了超时过期的视图,因为多个用户查看数据.在普通的度假村操作中,通过javascript在页面上处理排序,并且通过回调使列表/会话数据顺序保持同步.回调还会检查权限级别.在更复杂的特定度假操作上,页面上的javascript对页面进行回发以处理排序逻辑.列表/会话在回调中更新,然后列表视图控件将反弹到数据.页面再次加载,行显示新订单.没问题,对吧?
问题是列表视图中的某些元素不会根据新订单更改值.虽然在页面上处理的超链接和文本(例如像<%#Eval("ProjectAbbrev")%>)被适当更新,但是通过OnItemDataBound事件方法设置其值的复选框,文字和下拉列表不是 - 它们保持不变"冻结"到位,即使单步执行代码显示该方法在回发期间运行,并且控件应该设置为新值.如果我去手动截断列表,说原始大小的一半,确定只重新填充那些项目,但复选框等仍然保留其原始值.
所以我的问题是:为什么这些元素不会与回发中的其他listview控件元素一起更新?我觉得我要么误解了ASP.NET中的页面生命周期,要么我遇到了某种bug.
此时我认为我将不得不在javascript中将更复杂的排序操作移动到页面,但这将是相当棘手的,我想尽可能避免这样做.
Page:HyperLink元素将在回发后正确更新,但在OnQueueRepeater_ItemDataBound方法中赋值的CheckBox将保持不变.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>
<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
<ItemTemplate>
<tr>
<td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
<td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
</tr>
</ItemTemplate>
</asp:ListView>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:在回发时,执行以下代码:
protected List<Book> QueueDataItems
{
get { return (List<Book>)Session["Queue"]; }
set { Session["Queue"] = value; }
}
else if (IsPostBack && !Page.IsCallback)
{
// resort QueueDataItems List appropriately
ResortQueue(Request.Params)
// rebind
QueueListView.DataSource = QueueDataItems;
QueueListView.DataBind();
}
protected void OnQueueRepeater_ItemDataBound(object …Run Code Online (Sandbox Code Playgroud) 我在内部Web应用程序中使用System.DirectoryServices.AccountManagement时遇到了一个问题.错误不是很具描述性,但是这是正在发生的事情:
当我尝试验证AD中是否存在提供的用户ID时,我使用以下代码:
private bool IsWindowsIDValid(string strWindowsID)
{
var context = new PrincipalContext(ContextType.Domain, "DOMAINSERVER", "DC=DOMAINNAME,DC=net");
var userPrincipal = UserPrincipal.FindByIdentity(context, strWindowsID);
return (userPrincipal != null);
}
Run Code Online (Sandbox Code Playgroud)
但是,在第二行抛出异常,其中调用FindByIdentity.以下是异常详细信息:
消息:"发生了操作错误."
堆栈跟踪:
在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()在System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()在System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()在System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()在系统System.DirectoryServices上的System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context,Type principalType,String identityValue)中的.DirectoryServices.AccountManagement.Principal.FindBdentIdentityWithTypeHelper(PrincipalContext context,Type principalType,Nullable`1 identityType,String identityValue,DateTime refDate) .AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context,String identityValue)at*****.IsWindowsIDValid(String strWindowsID)in*****.ascx.cs:line 193
如果我尝试检查PrincipalContext的ConnectedServer属性,也会发生同样的错误.但是,我可以尝试根据上下文验证凭据(使用context.ValidateCredentials()),它将通过正常.
关于可能发生的事情的任何想法?我可以在我的机器上的独立控制台脚本中运行此代码 - 当我尝试调试webapp时,这发生在VisualStudio内部的本地开发环境中.这可能是权限问题还是其他问题?我在这一点上很丢失.
我感谢任何帮助!
-Patrick