小编Per*_*nce的帖子

否定`.Where()`LINQ表达式

我知道您可以执行以下操作:

enumerable.Where(MethodGroup).DoSomething();
Run Code Online (Sandbox Code Playgroud)

并且这实现了同样的事情:

enumerable.Where(x => MyMethod(x)).DoSomething();
Run Code Online (Sandbox Code Playgroud)

但是,我希望实现与此相反并选择方法返回false的项目.很明显,第二种情况如何做到这一点:

enumerable.Where(x => !MyMethod(x)).DoSomething();
Run Code Online (Sandbox Code Playgroud)

然而,对于第一种情况,情况并非如此,因为您无法将!运算符应用于a MethodGroup.有可能以类似的方式实现这种" .WhereNot"效果,MethodGroups还是我必须自己滚动(或使用lambdas)?

c# linq lambda

5
推荐指数
2
解决办法
1275
查看次数

什么时候应该使用[过时]属性,什么时候应该删除代码?

[Obsolete]本质上,函数的作用是停止使用类/函数,但仍将其保留在记录的代码中。

有什么充分的理由为什么[Obsolete]应该使用它,而不是仅仅删除或注释掉代码。如果您具有源代码控制,那么这个问题就更重要了,因此没有必要将代码保留作为参考,就像在SC中一样。

我对什么是最佳做法感到好奇?

c# obsolete

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

从对象填充 TreeView

我有一个相当简单的类结构,其中有Graphic对象,每个对象都包含一个List<Symbol>并且每个对象都Symbol包含一个List<Alias>:以及它们的其他属性。

最明显的方法(也是我当前的方法)是使用嵌套foreach循环来生成节点并填充树视图(这实际上工作正常),如下所示:

    public void ToTree(TreeView treeControl)
    {
        treeControl.Nodes.Clear();
        List<TreeNode> graphicsNodes = new List<TreeNode>();
        foreach (Graphic graphic in Graphics)
        {
            List<TreeNode> symbolNodes = new List<TreeNode>();
            foreach (Symbol symbol in graphic.Symbols)
            {
                List<TreeNode> aliasNodes = new List<TreeNode>();
                foreach (Alias alias in symbol.Aliases)
                {
                    aliasNodes.Add(new TreeNode(alias.AliasName + ": " + alias.AliasValue));
                }
                symbolNodes.Add(new TreeNode(symbol.SymbolName, aliasNodes.ToArray()));
            }
            graphicsNodes.Add(new TreeNode(graphic.FileName, symbolNodes.ToArray()));
        }
        treeControl.Nodes.AddRange(graphicsNodes.ToArray());
    }
Run Code Online (Sandbox Code Playgroud)

但是,我很好奇是否有任何我可以在我的类中实现的东西,或者我可以重载的任何方法,以便我可以简单地执行类似于treeView.Nodes.Add(graphic).

理想情况下,这将允许我确定正在单击哪个对象,而NodeClickEvent不是我必须获取节点的文本,然后单独执行搜索。

这样我就可以从该节点内直接访问每个对象的字段和成员,从而更轻松地通过单击TreeView事件修改属性。

c# treeview winforms

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

LINQ IEnumerable &lt;T&gt;内存结构

因此,我了解所有中最常见的集合C#都实现了IEnumerable<T>接口:List<T>,T[]并且Dictionary<TKey,TVal>全部都执行此操作。

但是,当您运行LINQ查询时,例如:

myCol.Where(myBoolMethod);

您以实现的未知类型返回数据IEnumerable<T>。

因此,我不知道这个数据是如何实际存储,直到你把它转换成一个有用的格式通过.ToList(),.ToArray()等等。

是否保留在来源类型中?它是否存储在伪数组中?是以上几种的组合吗?

除此之外,是否有任何理由为什么转换为一种类型IEnumerable<T>总是比转换为另一种类型更快-即在哪里myCol.Where(myBoolMethod).ToArray()总是比所myCol.Where(myBoolMethod).ToList()涉及的数据类型快?

c# linq memory

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

从 WebApplicationFactory 注入 HttpClient

WebApplicationFactory我正在尝试创建一组(大部分)统一的集成测试,这些测试可以针对从我们的应用程序的完全部署版本创建的内存中 API 。使用XUnit.DependencyInjection,我计划将 a 注入HttpClient到我的测试中,该测试要么指向测试服务器,要么基于环境变量指向真实的应用程序。

因此,要为测试服务器创建客户端,我可以在以下位置运行以下命令Startup.cs:

WebApplicationFactory<Program> app = new();
HttpClient client = app.CreateClient();
Run Code Online (Sandbox Code Playgroud)

这似乎有效。但是,我完全不知道如何将此实现注入到HttpClient各个测试类中。

像这样的东西不起作用(这样的重载不存在):

services.AddHttpClient<MyTestClass>(client);
Run Code Online (Sandbox Code Playgroud)

这也不是(注入的客户端BaseAddress由于某种原因设置为 null):

services.AddHttpClient<InMemoryServerSelfTests>(c =>
                                    {
                                        c.BaseAddress           = client.BaseAddress;
                                        c.Timeout               = client.Timeout;
                                    });
Run Code Online (Sandbox Code Playgroud)

我唯一的另一个想法是创建一个新类来包装两个客户端并注入它,但这看起来很混乱:

public class TestClientWrapper
{
    public readonly HttpClient Client;
    public TestClientWrapper(InMemoryTestServer server)
    {
        Client = server.CreateClient();
    }

    public TestClientWrapper(HttpClient client)
    {
        Client = client;
    }
}

// In Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    string targetEndpoint = Environment.GetEnvironmentVariable("targetEndpoint"); // Make …
Run Code Online (Sandbox Code Playgroud)

c# asp.net dependency-injection dotnet-httpclient

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

查看“for”循环内的迭代器

我正在尝试查看当前位置前面的字符,同时迭代&str.

\n
let myStr = "12345";\nlet mut iter = myStr.chars().peekable();\nfor c in iter {\n    let current: char = c;\n    let next: char = *iter.peek().unwrap_or(&\'\xe2\x88\x85\');\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我将把这个字符传递到一个方法中。然而,即使这个 MRE 也会产生移动后借用错误,我不知道如何克服该错误。

\n
error[E0382]: borrow of moved value: `iter`\n   --> src/lib.rs:7:27\n    |\n4   |     let mut iter = myStr.chars().peekable();\n    |         -------- move occurs because `iter` has type `Peekable<Chars<\'_>>`, which does not implement the `Copy` trait\n5   |     for c in iter {\n    |              ---- `iter` moved due to this implicit call to `.into_iter()`\n6   | …
Run Code Online (Sandbox Code Playgroud)

rust borrow-checker

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

Hashtable vs Dictionary:更快?

可能这个问题以前已经多次回答过很多次.然而,我正在寻找更具体的东西.我认为通用字典比Hashtables更快,因为它们不需要经历装箱/拆箱的过程.

但是,哈希表是否排序,这意味着搜索速度更快?由于键被散列和存储,搜索时是否会涉及装箱/拆箱?

c#

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

从带有空格的 JSON 字符串反序列化枚举

我将用这样的事实作为序言:我试图避免使用Newtonsoft.Json,因为表面上看,System.Text.Json它已经准备好在 .NET 6 中迎来黄金时段。

因此,我有两个来自 API 的枚举,我想使用此测试方法对它们进行反序列化:

[Theory]
[ClassData(typeof(TestDataGenerator))]
public void CanDeserialiseEnumsWithCustomJsonStrings(Enum expected, string jsonName)
{
    jsonName.ShouldNotBeNullOrEmpty();
    ReadOnlySpan<char> json = $"{{\"TestEnum\":\"{jsonName}\"}}";

    Type constructed = typeof(TestEnumWrapper<>).MakeGenericType(expected.GetType());
        
    var res = JsonSerializer.Deserialize(json, constructed);

    constructed.GetProperty("TestEnum").GetValue(res).ShouldBe(expected);
}

private class TestEnumWrapper<T> where T: struct
{
    public T TestEnum { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

(是的,我知道这可以通过 来完成JsonSerializer.Deserialize<T>(),我希望能够通过此测试测试许多类型,所以我需要反射 AFAICT)。

第一个,工作正常:

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum RecordType
{
        [JsonPropertyName("country")]
        Country = 1,

        [JsonPropertyName("destinationOrbit")]
        DestinationOrbit = 2,

        [JsonPropertyName("engine")]
        Engine = 3,
        //etc...

}
Run Code Online (Sandbox Code Playgroud)

第二个,反序列化失败,这似乎是由于名称中的空格造成的。

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum …
Run Code Online (Sandbox Code Playgroud)

c# enums json deserialization system.text.json

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

无法初始化数组

好吧,当涉及到C++(从VB转移过来)时,我是一个新手,我似乎无法解决如何在不执行的情况下填充数组:

array[0] = 1
array[1] = 2 
Run Code Online (Sandbox Code Playgroud)

等等

正如可以预料的那样,我试过这个:

float posVector[3]; //Declared outside of int main() as needs to be global
posVector = {0.0f,0.0f,0.0f}; //Inside int main()
Run Code Online (Sandbox Code Playgroud)

这导致显示此错误:

extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我无法在网上找到任何帮助.所以,任何建议,你可以给我修复这个将不胜感激!

c++ compiler-errors

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

由尚未运行的函数引起的错误

所以我正在写一个账单处理系统.数据目前位于Stack我编写的结构中.

我有这个部分编写的函数写出一个报告:

void GenerateReport(Bill* bill)
{
     PrintBillHeading(bill);
     //CallEntry* collatedEntries = CollapseCallStack(bill->callEntries);
//TODO
}
Run Code Online (Sandbox Code Playgroud)

只要我将第二行注释掉,哪个工作正常.如果我取消注释它,我PrintBillHeading()在下面指出的函数中得到一个SIGSEGV错误.

void PrintBillHeading(Bill* bill)
{
    printf("Big Brother Telecom\n");
    printf("Bill Date: %s\n\n",DateTimeToISOString(bill->date));
    printf("Contract Holder: %s %s\n", bill->title, bill->name);
    printf("Address:\n");
    char* addressSeg;
    char* addressCpy;
    strcpy(addressCpy,bill->address); //This line throws the SIGSEGV
    while ((addressSeg = strtok_r(addressCpy,";",&addressCpy)))
    {
        printf("%s\n\0",addressSeg);
    }
}
Run Code Online (Sandbox Code Playgroud)

为了完整性,这里是我的CollapseCallStack()功能,这是不完整的,完全未经测试,可能不起作用.

CallEntry* CollapseCallStack(Stack* calls)
{
    int size = calls->topIndex;
    CallEntry* collatedSet = malloc(sizeof(CallEntry) * size);
    CallEntry* poppedCall;
    int curIndex = 0;
    while (PopStack(calls,poppedCall))
    {
        bool …
Run Code Online (Sandbox Code Playgroud)

c segmentation-fault

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