试图为交换每个坐标X和Y值的方法找到一个好名字.
这个操作有名字吗?
从本质上讲,这就是做了什么
(1,2) - >(2,1)
在多边形上,这与旋转-90度并进行水平翻转或镜像相同.
可以使用以下构造来声明事件:
public class MyClass
{
public event EventHandler<EventArgs> SomeEvent = (s,e) => {};
public void SomeMethod ()
{
// Do something interesting... ;)
SomeEvent (this, new EventArgs);
}
}
Run Code Online (Sandbox Code Playgroud)
这允许在不需要检查事件是否为空的情况下引发事件.
现在,假设一个对象A持有对MyClass对象的引用,为该事件注册,然后稍后取消注册.
var myClass = new MyClass();
myClass.SomeEvent += MyHandler;
...
myClass.SomeEvent -= MyHandler;
myClass = null;
Run Code Online (Sandbox Code Playgroud)
即使事件中仍存在no-op lambda表达式,GC是否会收集myClass?
我想是的,因为对象root不再被其他对象引用了......任何人都可以确认或证明不是吗?
我创建了一个从Web服务获取数据的组件.Web服务返回ADO.NET数据集.
我希望这个组件成为与其他控件绑定的数据源.源数据将是数据集.
所以,我在组件中添加了一个属性DataSet.
private DataSet _dataSet;
public DataSet DataSet
{
get { return _dataSet; }
set
{
if (_dataSet == value)
return;
_dataSet = value;
OnPropertyChanged (this, new PropertyChangedEventArgs ("DataSet"));
}
}
Run Code Online (Sandbox Code Playgroud)
我为组件实现了IListSource.
public partial class MyComponent : Component, INotifyPropertyChanged, IListSource
{
...
IList IListSource.GetList()
{
return DataSet == null ? null : ((IListSource)DataSet).GetList();
}
bool IListSource.ContainsListCollection
{
get { return DataSet != null && ((IListSource)DataSet).ContainsListCollection; }
}
...
}
Run Code Online (Sandbox Code Playgroud)
在从Web服务接收数据的方法中,我执行以下操作:
...
DataSet = response.DataSet; // Copy dataset from web …Run Code Online (Sandbox Code Playgroud) 拥有以下类,在两个不同的程序集中:
class Member
{
public string Label {get;set;}
// Lots of other fields...
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width * Length;
}
// Other methods
}
class OtherMember
{
public string CompositeLabel {get;set;}
// Lots of other fields (not related to other class: Member)
public double Thickness {get;set;}
public double Width {get;set;}
public double Length {get;set;}
public double GetVolume ()
{
return Thickness * Width …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 WinForm 组件,在那里我启动一个任务来进行实际处理并在继续时捕获异常。从那里我想在 UI 元素上显示异常消息。
Task myTask = Task.Factory.StartNew (() => SomeMethod(someArgs));
myTask.ContinueWith (antecedant => uiTextBox.Text = antecedant.Exception.Message,
TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)
现在我收到一个跨线程异常,因为该任务正在尝试从一个明显的非 UI 线程更新 UI 元素。
但是,在 Component 类中没有定义 Invoke 或 BeginInvoke。
如何从这里开始?
更新
另外,请注意 Invoke/BeginInvoke/InvokeRequired 在我的 Component 派生类中不可用,因为 Component 不提供它们。
当然有一些东西,但谷歌搜索没有给我我正在寻找的东西.也许是因为我不知道要注意的算法的名称?
基本上,我有两个内容和大小相同的列表.
List1: {10, 30, 2, 4, 4}
List2: {4, 4, 10, 30, 2}
Run Code Online (Sandbox Code Playgroud)
请注意,两个列表的顺序相同.即:List2可以看作是从List1中的上一个位置到最后一个位置的开始,并且继续从List1的开始迭代直到返回到起始位置.
List1: {10, 30, 2, 4, 4} 10, 30, 2
| | | | |
List2: {4, 4, 10, 30, 2}
Run Code Online (Sandbox Code Playgroud)
然后将这两个列表视为等效.
以下两个列表不是:
List1: {10, 30, 2, 4, 3} 10, 30, 2
| | X X |
List2: {4, 4, 30, 10, 2}
Run Code Online (Sandbox Code Playgroud)
我现在正在做的是将List1连接到自身并在其中搜索List2.
我觉得这个效率不高.
假设我想迭代每个列表一次?
好吧,最后我使用了algo描述:检查字符串是否是另一个字符串的旋转而不连接 并将其调整为我的数据类型.
给定枚举类型:
public enum Work
{
Normal,
Extended
}
Run Code Online (Sandbox Code Playgroud)
我想做的是以下内容.
public abstract class Builder<T>
{
public static Builder<T> GetBuilder<T> (T work)
{
return new Builder<T> ();
}
}
public class BuilderNormal : Builder<Work.Normal>
{
}
public class BuilderExtended : Builder<Work.Extended>
{
}
Run Code Online (Sandbox Code Playgroud)
我特别想避免在Builder中使用switch/case或使用我需要维护的映射,当我向Work添加新的枚举值时,即我可以这样做
public abstract class Builder
{
public static Builder GetBuilder (Work work)
{
switch (work)
{
case Work.Normal:
return new BuilderNormal ();
case Work.Extended:
return new BuilderExtended ();
default:
throw new ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上,我想根据枚举值创建一个类的实例,并且该类必须是抽象类的子类.
c# ×4
components ×2
winforms ×2
.net ×1
coordinates ×1
data-binding ×1
events ×1
interface ×1
invoke ×1
lambda ×1
math ×1
model ×1
refactoring ×1
rotation ×1