小编Him*_*ere的帖子

为什么.Clear()函数清除了错误的列表?

public void ConvertMoves()
{
    for (int i = 0; i < maxDirections; i++)
    {
        Debug.Log("gimme tsMoves "+tSpossibleMoves[i].Count +  " from " + this);
        possibleAttacks[i] = tSpossibleAttacks[i];
        possibleAttacksInactive[i] = tSpossibleAttacksInactive[i];
        possibleAttackIndicators[i] = tSpossibleAttackIndicators[i];
        possibleMoves[i] = tSpossibleMoves[i];
        Debug.Log("Gimme moves(1) " + possibleMoves[i].Count + " from " + this);
    }
    for (int i = 0; i < maxDirections; i++)
    {
        tSpossibleAttacks[i].Clear();
        tSpossibleAttacksInactive[i].Clear();
        tSpossibleAttackIndicators[i].Clear();
        tSpossibleMoves[i].Clear();
        Debug.Log("Gimme moves(2) " + possibleMoves[i].Count + " from " + this);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以调试日志报告以下内容:

gimme tsMoves 2来自JeanArc(克隆)(JeanArc)
Gimme移动(1)2来自JeanArc(克隆)(JeanArc)

一切都很好,但后来...... …

c# list

3
推荐指数
1
解决办法
94
查看次数

工厂模式使用反射 - 使用与每个类关联的静态键进行类注册

在研究某些模式时,我遇到了工厂模式,以创建(未知)类的实例.这让我感兴趣,因此我想构建一个可以动态增强的程序.所以我在一个程序集中有一些基本功能,在不同程序集中有实际的工作程序.我从应用程序中获得的唯一提示是操作名称.现在我想创建一个依赖于该操作的新工作者.因为我不知道工人的实际实施,所以我选择了这种模式.

好的,更多细节:

我有一个接口IWorker,我的所有流程都实现了.Singleton WorkerFactory允许我创建在与当前路径相同的路径中的任何程序集中实现的任何worker的新实例.为此,我CreateWorker在我的接口中添加了一个接受字符串数组的方法(已经传递varargs给控制台应用程序).

在能够创建任何工人的任何实例之前,我必须将任何类注册到工厂.不幸的是在C#这是不可能静态地插入这样的行为变成了工人类的任何静态情况下,因为这个范围内的代码才会执行上课的时候以任何方式访问(通过实例,或通过访问任何的吧它的静态成员,请参阅静态构造函数).因此,我通过使用当前正在执行的程序集的路径反映所有程序集中找到的所有类型来实现此目的.现在我可以检查当前类型是否正在实现接口,如果是,则可以将类型添加到包含操作名称(键)和工作者(值)的工厂的注册图中System.Type(参见使用反射的工厂模式).问题是:如何获取此类型引用的操作的实际名称.

我认为有两种选择:

  1. 我向每个存储操作名称的worker-class添加一个静态属性.因此,我可以通过在获得的类型上反映此属性来引用该操作.
  2. 为名称添加非静态属性,并在注册时创建实际worker类的虚拟实例.

前者选项的缺点是,我不能保证所有的工人居然有这样的静态属性实现的(因此它无法静态成员添加到IWorker接口),后者每一个类必须有一个空的缺点构造函数,以便构建从中获取操作名称的虚拟实例.然而,这个构造函数可以公开访问,而不包含任何初始化代码.

说完所有这些问题都是关于使用反射的工厂模式的最佳或至少更好的实践.我想我更喜欢第一种选择,但也许我也错过了这种方法的更好的解决方案.

因此这个帖子已经很长了我不想在这里发布任何代码,但是如果你需要的话请告诉我.

c# reflection factory-pattern

2
推荐指数
1
解决办法
2259
查看次数

LINQ执行时间

今天我注意到,当我在大数据上运行几个LINQ语句时,所花费的时间可能会有很大差异.

假设我们有这样的查询:

var conflicts = features.Where(/* some condition */);           
foreach (var c in conflicts) // log the conflicts
Run Code Online (Sandbox Code Playgroud)

features表示表中行的对象列表在哪里.因此,这些对象非常复杂,甚至查询它们的一个简单属性是一个巨大的操作(包括实际的数据库查询,验证,状态更改......)我认为执行这样的查询需要很长时间.错误:第一个语句在很短的时间内执行,而简单地循环结果则是永恒的.

但是,如果我将LINQ表达式检索到的集合转换为List,使用IEnumerable#ToList()第一个语句运行速度稍慢并且循环结果非常快.话虽如此,第二次接近的完整持续时间远小于不转换为列表时的持续时间.

var conflicts = features.Where(/* some condition */).ToList();           
foreach (var c in conflicts) // log the conflicts
Run Code Online (Sandbox Code Playgroud)

所以我认为var conflicts = features.Where实际上并不是查询而是准备数据.但我不明白为什么转换到列表然后循环比这快得多.这是实际的问题

有人对此有解释吗?

c# linq

2
推荐指数
1
解决办法
974
查看次数

如何永久存储cookie

我不想在我的应用程序代码中显示邮件ID.我想给文本框和我将给它的电子邮件ID应该存储在web.config文件中,直到我更改它.

string store= "kumar@gmail.com";
ConfigurationManager.AppSettings["MailId"] = store;
string message1 = ConfigurationManager.AppSettings["MailId"];

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2001"/>
    <add key="MailId" value="krishnamohan.p@sun.com" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

c# asp.net cookies session web-config

2
推荐指数
1
解决办法
1万
查看次数

比较两个序列是否相等

在将其标记为重复之前,请考虑以下简短程序:

static void Main()
{
    var expected = new List<long[]> { new[] { Convert.ToInt64(1), Convert.ToInt64(999999) } };
    var actual = DoSomething();
    if (!actual.SequenceEqual(expected)) throw new Exception();
}

static IEnumerable<long[]> DoSomething()
{
    yield return new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法返回long类型的数组序列.为了测试它,我写了一些类似于其中的测试代码Main.

但是我得到了例外,但我不知道为什么.难道预期的序列不应该与实际返回的序列相比,还是我错过了什么?

对我而言,它看起来既是方法又epxected包含一个包含long类型数组的单个元素,不是吗?

编辑:那么如何实现不获取异常意义来比较枚举中的元素以返回相等性?

c# ienumerable yield

2
推荐指数
1
解决办法
2081
查看次数

热到在一个if语句中搜索2个xml文件的存在?

正如标题所示,我试图写一个if else语句来搜索2 xml文件的存在(如果它们确实存在,用户将可以选择加载哪一个),但目前我能做的就是其他的if if假设只有两个文件中的一个,

private void yourCharacterInformationButton_Click(object sender, RoutedEventArgs e)
    {
        // This will search for and load the saved name class from the relevant Xml file.
Run Code Online (Sandbox Code Playgroud)

下面是我的代码当前代码

拖网浏览了一段时间后,我无法在这里找到答案,如果有人能提供一个很棒的答案,那么我想做的就是在同一个if语句中搜索2个文件的存在,如

if(file.exists("ClassData.xml", "UserClassData.xml")
{
       messagebox.show("Which version do you want to load?").
Run Code Online (Sandbox Code Playgroud)

c# file-exists

2
推荐指数
1
解决办法
74
查看次数

如何在不同的前提条件下运行相同的 nunit 测试?(赛程)

我有一组测试,必须在基类中使用两个不同的 SetUp 来运行它。

这是截图http://screencast.com/t/G150W2P4o

我该如何改进它?

c# nunit

2
推荐指数
1
解决办法
1494
查看次数

将此 .NET 字符串更改为 const 是否会提高性能?IL 会自动这样做吗?

鉴于以下简单的 .NET 代码,这两者之间在字符串方面有什么区别"xml"吗?

if (extension.Equals("xml", StringComparison.OrdinalIgnoreCase))
{
    return FileType.Xml;
}
Run Code Online (Sandbox Code Playgroud)

对比

const string xmlText = "xml";
if (extension.Equals(xmlText, StringComparison.OrdinalIgnoreCase))
{
    return FileType.Xml;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个词"xml"在课堂上再也没有出现过。它实际上就在那个地方。

我的印象是,.NET 编译器的更新版本将像这样的简单字符串转换为 const(在后台)。

更棒的是,如果在另一个地方使用了另一个 "xml"字符串,编译器只会创建一个const,并且这两个引用都将引用该单个字符串引用/内存分配。

那么 - 在性能方面,幕后有什么不同吗?

免责声明:请不要发表“微优化”评论。我明白了。这实际上是关于理解事物与尝试对一行代码进行微优化。

.net c#

2
推荐指数
1
解决办法
914
查看次数

如果字符串为空或空,如何将默认值设置为字符串

有没有更好的方法来使用 Null Coalescing 运算符检查字符串是否为空或 null。当我对字符串使用空值而不是 null 时,null Coalescing 运算符无法获得所需的结果。

 string x = null;
 string y = x ?? "Default Value";
 Console.WriteLine(y);
    
Run Code Online (Sandbox Code Playgroud)

在这里,如果我x = nullx=""这个替换,则不起作用。

如果我使用String.IsNullOrEmpty方法

if(String.IsNullOrEmpty(x)
{
    y= "default value"
}
{
    y =x 
}
    
Run Code Online (Sandbox Code Playgroud)

我的代码块有多行,我想让它变得简单。您能建议一种更好的方法来保持代码干净简单吗?因为它被用在很多地方。

.net c# asp.net-mvc-4 .net-core

2
推荐指数
1
解决办法
3224
查看次数

使用LINQ排序列表

今天我刚尝试了LINQ-Framework,并想知道是否有办法做到以下几点.我有一份地址列表,其中包含街道名称和房屋编号.首先,我根据他们的街道名称列出所有地址

list = list.OrderBy(x => x.StreetName)
Run Code Online (Sandbox Code Playgroud)

如果街道名称相同,我想使用-expression比较房屋号码ThenBy,但这里是问题,因为房屋号码可能由两部分组成:一个整数(例如12)和一个字符串后缀(例如A),这导致12A.所以我想对housenumber(int值)和后缀(字符串值)的列表进行排序.我还创建了正则表达式来将housenumber分成int和string值,所以这不是问题,这就是它:(\d+) *(\S)*但是我没有得到这两个值(在某些情况下只有一个因为没有后缀)以及LINQ的排序.

我有什么办法吗?

c# linq sorting

1
推荐指数
1
解决办法
215
查看次数