我一直有麻烦关节之间的差异ILookup<TKey, TVal>
和IGrouping<TKey, TVal>
,并很好奇,如果我理解正确了.LINQ通过生成IGrouping
项目序列来复杂化问题,同时也为我提供了ToLookup
扩展方法.所以在我仔细观察之前感觉它们是一样的.
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)
这相当于:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)
这看起来很像:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
Run Code Online (Sandbox Code Playgroud)
我在以下类比中是否正确?
IGrouping<TKey, TVal>
是一个单独的组(即键控序列),类似于KeyValuePair<TKey, TVal>
值实际上是一系列元素(而不是单个元素)IEnumerable<IGrouping<TKey, TVal>>
是那些序列(类似于迭代时得到的结果)IDictionary<TKey, TVal>
ILookup<TKey, TVal>
更像是一个IDictionary<TKey, …
我知道通过默默无闻的安全性是不受欢迎的,并且被认为不是很安全,但通过默默无闻的密码安全性不是吗?只要没有人发现它,它就是安全的.
这只是默默无闻的问题吗?(即一个好的密码很好的盐渍和散列是不切实际的打破)
注意我不是在询问保存密码的过程(假设它们是正确的哈希和盐渍).我问的是整个想法使用密码,这是一条信息,如果知道可能会损害一个人的帐户.
或者我误解了默默无闻的安全意味着什么?我想这就是我认为的意思,就是存在一些信息,如果已知会损害系统(在这种情况下,系统被定义为密码意味着要保护的)
我有一个听众:
listener = new HttpListener();
listener.Prefixes.Add(@"http://+:8077/");
listener.Start();
listenerThread = new Thread(HandleRequests);
listenerThread.Start();
Run Code Online (Sandbox Code Playgroud)
我正在处理请求:
private void HandleRequests()
{
while (listener.IsListening)
{
var context = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
context.AsyncWaitHandle.WaitOne();
}
}
private void ListenerCallback(IAsyncResult ar)
{
var listener = ar.AsyncState as HttpListener;
var context = listener.EndGetContext(ar);
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)
我想void Stop()
用这样的方式写:
ListenerCallback
).listener.Stop()
(listener.IsListening
变为假).怎么可能写?
编辑:您对此解决方案有何看法?安全吗?
public void Stop()
{
lock (this)
{
isStopping = true;
}
resetEvent.WaitOne(); //initially set to true …
Run Code Online (Sandbox Code Playgroud) 我有一个这样的对象:
public class Person : IDataErrorInfo
{
public string PersonName{get;set;}
public int Age{get;set;}
string IDataErrorInfo.this[string propertyName]
{
get
{
if(propertyName=="PersonName")
{
if(PersonName.Length>30 || PersonName.Length<1)
{
return "Name is required and less than 30 characters.";
}
}
return null;
}
}
string IDataErrorInfo.Error
{
get
{
if(PersonName=="Tom" && Age!=30)
{
return "Tom must be 30.";
}
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
绑定PersonName和Age属性很简单:
<TextBox Text="{Binding PersonName, ValidatesOnDataErrors=True}" />
<TextBox Text="{Binding Age, ValidatesOnDataErrors=True}" />
Run Code Online (Sandbox Code Playgroud)
但是,如何使用Error属性并正确显示它?
在阅读了什么是空终止字符串的基本原理?我发现在C#/.中,一些类似的问题在内部,Net字符串都是长度前缀和null终止,就像在BSTR数据类型中一样.
字符串是长度前缀还是空终止而不是例如的原因是什么.只有长度 - 前缀?
如果您使用GUID作为面向公众的应用程序的密码作为获取服务访问权的手段,这种安全性是否通过默默无闻?
我认为显而易见的答案是肯定的,但是对我来说安全级别似乎很高,因为猜测GUID的可能性非常低是正确的吗?
更新
GUID将存储在设备中,当插入时,将通过SSL连接通过GUID发送.
也许我可以生成GUID,然后在GUID上执行AES 128位加密并将该值存储在设备上?
我想格式化<s:property value="summary.total"/>
Struts 2中标记显示的数字.有一个double
值.我怎样才能做到这一点?我应该用OGNL
吗?
或者也许我必须使用<s:text/>
标签并在资源文件中定义我的格式?
编辑:这个题目标题最初是:Doctrine如何知道MySQL中最后插入的id?并与Doctrine ORM mapper有关.经过一番挖掘后,我发现这个问题与Doctrine无关,而是与PDO_MySQL,MySQL C API以及最终的MySQL客户端 - 服务器通信有关.我决定更改标题,所以也许有人会找到他/她的问题的答案.
对于那些不使用学说的人:我很好奇,为什么吼叫:
mysql_query("INSERT INTO category (name) VALUES('cat')");
echo mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)
或类似的:
$pdo->exec("INSERT INTO category (name) VALUES('cat')");
echo $pdo->lastInsertId();
Run Code Online (Sandbox Code Playgroud)
将导致SELECT LAST_INSERT_ID()
日志中只有一个位置(没有单独):
1701 Query INSERT INTO category (name) VALUES ('cat')
Run Code Online (Sandbox Code Playgroud)
原始问题:
我有2张桌子:
category(id,name)
product(id, name, categoryId)
Run Code Online (Sandbox Code Playgroud)
我创建了新的类别对象和产品对象.我将类别对象分配给产品对象.我没有设置任何ID:
$product = new Product();
$product->name = 'asdf';
$category = new Category();
$category->name = 'cat';
$product->Category = $category;
Run Code Online (Sandbox Code Playgroud)
之后,我刷新连接并检查MySQL日志:
1684 Query START TRANSACTION
1684 Query INSERT INTO category (name) …
Run Code Online (Sandbox Code Playgroud) 我是数据绑定的新手.
我有这些课程:
public class Foo : List<Bar>
{
public string FooName { get; set; }
}
public class Bar
{
public string BarName { get; set; }
public string BarDesc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个 List<Foo>
我想要有Foo
物品ComboBox
和Bar
物品ListBox
.当我更改所选项目时ComboBox
,我想要ListBox
更改.当我更改所选项目时,ListBox
我想TextBox
填写BarDesc
.
下面只对作品ListBox
和ComboBox
:
comboBox1.DataSource = foos;
comboBox1.DisplayMember = "FooName";
listBox1.DataBindings.Add("DataSource", foos, "");
listBox1.DisplayMember = "BarName";
Run Code Online (Sandbox Code Playgroud)
我现在不如何绑定选择做Bar
的ListBox
到TextBox.Text
财产.也许添加绑定 …
任何时候初学者都会问:如何从C#中的另一个线程更新GUI?,答案很简单:
if (foo.InvokeRequired)
{
foo.BeginInvoke(...)
} else {
...
}
Run Code Online (Sandbox Code Playgroud)
但使用它真的很好吗?在非GUI线程执行后foo.InvokeRequired
,状态foo
可以改变.例如,如果我们在之后foo.InvokeRequired
,但之前关闭表单foo.BeginInvoke
,则调用foo.BeginInvoke
将导致InvalidOperationException
:在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke.如果我们在调用之前关闭表单,这不会发生InvokeRequired
,因为false
即使从非GUI线程调用它也是如此.
另一个例子:让我们说foo
是一个TextBox
.如果你关闭表单,然后执行非GUI线程foo.InvokeRequired
(这是错误的,因为表单已关闭),foo.AppendText
它将导致ObjectDisposedException
.
相比之下,在我看来,使用WindowsFormsSynchronizationContext
更容易 - Post
只有当线程仍然存在时才会发布使用回调,如果线程不再存在则使用Send
throws进行同步调用InvalidAsynchronousStateException
.
是不是WindowsFormsSynchronizationContext
更容易使用?我错过了什么吗?如果它不是真的线程安全,为什么我应该使用InvokeRequired-BeginInvoke模式?你觉得哪个更好?