.NET有很多复杂的数据结构.不幸的是,它们中的一些非常相似,我不总是确定何时使用一个以及何时使用另一个.我的大多数C#和Visual Basic书籍都在一定程度上谈论它们,但它们从未真正涉及任何真实的细节.
Array,ArrayList,List,Hashtable,Dictionary,SortedList和SortedDictionary之间有什么区别?
哪些是可枚举的(IList - 可以做'foreach'循环)?哪些使用键/值对(IDict)?
内存占用情况如何?插入速度?检索速度?
还有其他值得一提的数据结构吗?
我还在寻找有关内存使用和速度的更多细节(Big-O表示法).
假设我有一个表列,其结果如下:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Run Code Online (Sandbox Code Playgroud)
我希望能够编写一个从所述表中选择此列的查询,但只返回子字符串直到Underscore(_)字符.例如:
ABC
DEFGH
IJKLMNOP
Run Code Online (Sandbox Code Playgroud)
SUBSTRING函数似乎不适合任务,因为它是基于位置的,并且下划线的位置不同.
我想到了TRIM功能(特别是RTRIM功能):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Run Code Online (Sandbox Code Playgroud)
但是我不确定我是如何让它工作的,因为它似乎只删除了某个列表/一组字符,而我实际上只是在导致Underscore字符的字符之后.
如何获取List(使用LINQ)并将其分解为每隔8个条目分区原始列表的列表列表?
我想像这样的东西会涉及Skip和/或Take,但我仍然是LINQ的新手.
编辑:使用C#/ .Net 3.5
编辑2:这个问题的措辞不同于其他"重复"问题.虽然问题是相似的,但这个问题的答案是优越的:"接受"的答案都非常可靠(包括yield声明)以及Jon Skeet建议使用MoreLinq(在"其他"问题中不推荐使用).有时复制是好的,因为它们迫使重新检查问题.
在Windows窗体应用程序中,下拉选择器列表还为用户提供了在同一字段中键入备用值的选项(假设开发人员已在控件上启用此选项.)
如何在HTML中实现这一目标?看起来好像只能从列表中选择值.
如果使用直接HTML无法做到这一点,有没有办法用Javascript做到这一点?
在查看MSDN之后,我仍然不清楚如何使用T的成员变量(其中T是一个类)在List中使用Find()方法形成一个正确的谓词
例如:
public class Car
{
public string Make;
public string Model;
public int Year;
}
{ // somewhere in my code
List<Car> carList = new List<Car>();
// ... code to add Cars ...
Car myCar = new Car();
// Find the first of each car made between 1980 and 2000
for (int x = 1980; x < 2000; x++)
{
myCar = carList.Find(byYear(x));
Console.Writeline(myCar.Make + myCar.Model);
}
}
Run Code Online (Sandbox Code Playgroud)
我的"byYear"谓词应该是什么样的?
(MSDN示例仅讨论恐龙列表,仅搜索不变的值"saurus" - 它没有显示如何将值传递给谓词...)
编辑:我正在使用VS2005/.NET2.0,所以我不认为Lambda符号可供我使用...
EDIT2:在示例中删除了"1999",因为我可能希望根据不同的值以编程方式"查找".使用for-do循环将示例更改为1980年至2000年的汽车范围.
我目前正在尝试使用PrincipalContext类通过Active Directory服务进行身份验证.我想让我的应用程序使用密封和SSL上下文对域进行身份验证.为了做到这一点,我必须使用PrincipalContext的以下构造函数(链接到MSDN页面):
public PrincipalContext(
ContextType contextType,
string name,
string container,
ContextOptions options
)
Run Code Online (Sandbox Code Playgroud)
具体来说,我正在使用构造函数:
PrincipalContext domainContext = new PrincipalContext(
ContextType.Domain,
domain,
container,
ContextOptions.Sealing | ContextOptions.SecureSocketLayer);
Run Code Online (Sandbox Code Playgroud)
MSDN说"容器":
商店中的容器用作上下文的根.所有查询都在此根下执行,所有插入都将在此容器中执行.对于Domain和ApplicationDirectory上下文类型,此参数是容器对象的可分辨名称(DN).
容器对象的DN是多少?如何找出容器对象是什么?我可以查询Active Directory(或LDAP)服务器吗?
此时,我正在管理一个包含多个XML配置文件的软件.当发布新版本的软件时,有时基本配置文件会发生变化,我们目前在启动时会调用KDiff软件.如果检测到更改,则会提示用户选择更改.
这种方法的问题在于KDiff是一个比较程序的行,而不是知道XML的方式(如节点等)
理想情况下,我想以编程方式使用C#中的库(因为我们是一个MS商店),它可以扩展两个XML文件:源XML和当前工作XML.
然后使用一些简单的规则将两者合并在一起:
例如,这是"源"XML:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
这是"当前工作"XML:
<Configuration>
<Items>
<Item Id="1" Position="false">
<Location X="123" Y="234" Z="345" />
<Another/>
<Something/>
</Item>
</Items>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
合并后的版本看起来像:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="123" Y="234" Z="345" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
我查看了MS XML Diff和Patch Tool,它肯定将文件合并在一起,但不允许我想要定义的编程规则.
XMLUnit for Java开发人员似乎很有希望,但它的.NET版本似乎还不发达,这是不幸的.
任何人对可编写脚本的XML Diff/Merge工具和/或.NET库(付费或免费)有任何建议吗?
谢谢.
Python对我来说是一种相对较新的语言.单元测试和依赖注入是我现在已经做了一段时间的事情,所以我从C#的角度来熟悉它.
最近,我写了这段Python代码:
import requests # my dependency: http://docs.python-requests.org/en/latest/
class someClass:
def __init__(self):
pass
def __do(self, url, datagram):
return requests.post(self, url, datagram)
Run Code Online (Sandbox Code Playgroud)
然后我意识到我刚刚创建了一个硬编码的依赖项.的Bleh.
我曾考虑改变我的代码来做"构造函数"依赖注入:
def __init__(self,requestLib=requests):
self.__request = requestLib
def __do(self, url, datagram):
return self.__request.post(self, url, datagram)
Run Code Online (Sandbox Code Playgroud)
这现在允许我为单元测试注入假/模拟依赖,但不确定这是否被认为是Python-ic.所以我向Python社区寻求指导.
有哪些Python-ic方法可以做基本的DI(主要是为了编写利用Mocks/Fakes的单元测试)?
ADDENDUM对于对模拟答案感到好奇的人,我决定在这里问一个单独的问题:@ mock.patch如何知道每个模拟对象使用哪个参数?
我最近在C#(.Net 2.0)中编写了一个DLL,其中包含一个需要IP地址的类.我的同事改变了类以从".dll.config"(XML)文件中检索IP - 这显然是由他创建的"应用程序设置"文件(Settings1.settings)自动生成的.这样做的好处是允许最终用户随意更改XML/config文件中的IP地址.
不幸的是,当我从树中检查他的代码并尝试编译(或使用)这个新代码时,任何调用此DLL的应用程序只获取默认值,而不是文件中的值.
调用配置文件的构造函数如下所示:
public class form : System.Windows.Forms.Form
{
public form()
{
// This call is required by the Windows Form Designer.
InitializeComponent();
IP = IPAddress.Parse(Settings1.Default.IPAddress);
}
}
Run Code Online (Sandbox Code Playgroud)
"旧"值(您在开发时定义的值)是硬编码的.如果franework无法访问或打开配置文件,它将使用默认值.如果您在dll中使用设置,这将始终发生.
这是否意味着我无法在配置文件中存储DLL的外部值?(我的同事以某种方式完成了这项工作......)
由于我的框架似乎无法访问或打开配置文件,我该如何找出它失败的原因?甚至可以检测到何时发生?
德克尔:这有点帮助.不幸的是,我正在将此DLL写入规范,因此我实际上无法访问应用程序的配置文件.如上所述,我的同事创建了"Settings 1 .settings"文件.我当时并不理解这一点,但现在似乎添加"1"会使其超出任何调用它的应用程序的设置空间.
我想我想弄清楚的是为什么DLL似乎没有找到位于同一目录旁边的配置文件.通过代码逐步跟踪不会显示任何内容.
顺便说一句,我可以将程序集的"输出类型"从"类库"更改为"Windows应用程序",并在我的DLL代码的开头添加以下行:
[STAThread]
public static void Main(string[] args)
{
System.Windows.Forms.Application.Run(new form());
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它会生成一个不同的配置文件(".exe.config"),我可以改变它并从文件中提取新数据.所以我有点困惑.有任何想法吗?
我正在尝试获取我的C#2.0应用程序之外的窗口的可执行文件的名称.我的应用程序当前使用来自"user32.dll"的GetForegroundWindow()调用获取窗口句柄(hWnd).
从我能够做的挖掘,我想我想使用GetModuleFileNameEx()函数(来自PSAPI)来获取名称,但GetModuleFileNameEx()需要一个Process的句柄,而不是一个Window.
是否可以从窗口句柄获取进程句柄?(我是否需要先获取窗口的线程句柄?)
编辑了第一句话,使我更清楚我正在尝试做什么.
UPDATE!这是我发现为我工作的C#代码.唯一需要注意的是偶尔它返回一个文件/路径,其中驱动器盘符是"?" 而不是实际的驱动器号(如"C"). - 还没弄明白为什么呢.
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
private string GetWindowModuleFileName(IntPtr hWnd)
{
uint processId = 0;
const int nChars = 1024;
StringBuilder filename = new StringBuilder(nChars);
GetWindowThreadProcessId(hWnd, out processId);
IntPtr hProcess = OpenProcess(1040, 0, …Run Code Online (Sandbox Code Playgroud)