小编Şaf*_*Gür的帖子

IList <T>和IReadOnlyList <T>

如果我有一个需要参数的方法,

  • Count房产
  • 有一个整数索引器(get-only)

这个参数的类型应该是什么?我会IList<T>在.NET 4.5之前选择,因为没有其他可索引的集合接口,并且数组实现它,这是一个很大的优点.

但.NET 4.5引入了新的IReadOnlyList<T>界面,我也希望我的方法能够支持它.我如何编写这种方法来支持这两种方法,IList<T>IReadOnlyList<T>不是违反像DRY这样的基本原则?

编辑:丹尼尔的回答给了我一些想法:

public void Foo<T>(IList<T> list)
    => Foo(list, list.Count, (c, i) => c[i]);

public void Foo<T>(IReadOnlyList<T> list)
    => Foo(list, list.Count, (c, i) => c[i]);

private void Foo<TList, TItem>(
    TList list, int count, Func<TList, int, TItem> indexer)
    where TList : IEnumerable<TItem>
{
    // Stuff
}
Run Code Online (Sandbox Code Playgroud)

编辑2:或者我可以接受一个IReadOnlyList<T>并提供这样的帮助:

public static class CollectionEx
{
    public static IReadOnlyList<T> AsReadOnly<T>(this IList<T> list)
    {
        if (list == …
Run Code Online (Sandbox Code Playgroud)

.net c# collections interface .net-4.5

35
推荐指数
3
解决办法
3万
查看次数

使用数据库表中的排序顺序列

假设我Product在购物网站的数据库中有一张桌子,用于保存商店产品的描述,价格等.使我的客户能够重新订购这些产品的最有效方法是什么?

我创建了一个Order用于排序记录的列(整数),但由于我在实际需要更改之后用于更改每个记录顺序的原始方法,这让我对性能产生了一些麻烦.一个例子:

Id    Order
5     3
8     1
26    2
32    5
120   4
Run Code Online (Sandbox Code Playgroud)

现在我该怎么做才能将记录的顺序更改ID=26为3?

我所做的是创建一个程序,检查目标订单中是否有记录(3),如果没有,则更新行的顺序(ID = 26).如果目标顺序中有记录,则该过程将自行发送该行的ID target order + 1作为参数.

这导致在我想要改变以便腾出空间之后更新每一条记录:

Id    Order
5     4
8     1
26    3
32    6
120   5
Run Code Online (Sandbox Code Playgroud)

那么聪明人会做些什么呢?

  • 我使用SQL Server 2008 R2.

编辑:

我需要一个项目的订单列足以进行排序,而不涉及二级密钥.单独的订单列必须为其记录指定唯一的位置.

除此之外,我想知道我是否可以实现链接列表之类的内容:"下一个"列而不是"订单"列以保留下一个项目ID.但我不知道如何编写以正确顺序检索记录的查询.如果有人也对这种方法有所了解,请分享.

database sql-server sorting

31
推荐指数
5
解决办法
3万
查看次数

定制等待傻瓜

Async/Await FAQ中,Stephen Toub说:

一个awaitable是任何类型的,它公开GetAwaiter它返回一个有效的方法awaiter.
...
一个awaiter任何从一个返回类型awaitableGetAwaiter方法和符合特定的图案.

因此,为了成为awaiter,类型应该:

  • 实现INotifyCompletion接口.
  • 提供一个名为的布尔属性IsCompleted.
  • 提供一个GetResult返回void或无参数的方法TResult.

(我现在忽略ICriticalNotifyCompletion了.)

我知道我提到的页面有一个示例,显示编译器如何转换等待操作,但我很难理解.

当我等待awaitable,

  • 什么时候IsCompleted检查?我应该在哪里设置它?
  • 何时被OnCompleted召唤?
  • 哪个线程调用OnCompleted
  • 我看到了直接调用continuation参数OnCompletedTask.Run(continuation)在不同示例中使用的示例,我应该选择哪个以及为什么?

.net c# asynchronous async-await .net-4.5

25
推荐指数
2
解决办法
7841
查看次数

线程安全集合,没有订单,也没有重复

我需要一个线程安全的集合来保存没有重复的项目.ConcurrentBag<T>允许非唯一项,HashSet<T>并且不是线程安全的.在.NET Framework 4.5中是否有这样的集合?

.net c# collections concurrency thread-safety

18
推荐指数
2
解决办法
3747
查看次数

为什么不使用lambda表达式初始化的非捕获表达式树被缓存?

考虑以下课程:

class Program
{
    static void Test()
    {
        TestDelegate<string, int>(s => s.Length);

        TestExpressionTree<string, int>(s => s.Length);
    }

    static void TestDelegate<T1, T2>(Func<T1, T2> del) { /*...*/ }

    static void TestExpressionTree<T1, T2>(Expression<Func<T1, T2>> exp) { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)

这是编译器生成的内容(以稍微不易读的方式):

class Program
{
    static void Test()
    {
        // The delegate call:
        TestDelegate(Cache.Func ?? (Cache.Func = Cache.Instance.FuncImpl));

        // The expression call:
        var paramExp = Expression.Parameter(typeof(string), "s");
        var propExp = Expression.Property(paramExp, "Length");
        var lambdaExp = Expression.Lambda<Func<string, int>>(propExp, paramExp);
        TestExpressionTree(lambdaExp);
    }

    static void TestDelegate<T1, …
Run Code Online (Sandbox Code Playgroud)

c# lambda delegates compilation expression-trees

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

动态样式表使用Razor

如何在CSS文件中使用Razor?

我正在使用Razor View Engine一段时间,我很好奇在样式表上使用它.我可以在.cshtml文件<style>块中使用Razor,但我想知道我是否也可以在外部.css文件中使用它(希望有.cscss格式).所以我用Google搜索并发现了两件事:

第一个是LESS:"动态样式表语言".它似乎易于使用且功能强大,具有所有功能,但我需要Razor-C#,真的.

第二个是动态CSS使用Razor引擎,一个CodeProject文章更像我想要的但它没有缓存或预编译支持("不支持"我的意思是作者没有提到这些方面).我也希望在Visual Studio中有一些语法高亮,但这是次要的.

那么,我如何以最低的性能成本在CSS文件中编写Razor,最好是语法高亮?

  • 是否有一个"更完整"的项目?
  • 我可以改进上面的项目来实现缓存/编译吗?如果是这样,怎么样?

作为旁注:
我找到了一个名为RazorJS的项目.它就像我想要的CSS的Javascript版本以及它的缓存支持.我提到这只是为了澄清我的需求.我现在不需要在Javascript中使用Razor,但我想如果我用CSS制作它,用Javascript做同样的事情也不会太难.

css server-side visual-studio razor

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

如何记录异步方法的异常?

使用XML文档的示例方法:

// summary and param tags are here when you're not looking.
/// <exception cref="ArgumentNullException>
///    <paramref name="text" /> is null.
/// </exception>
public void Write(string text)
{
    if (text == null)
        throw new ArgumentNullException("text", "Text must not be null.");

    // sync stuff...
}
Run Code Online (Sandbox Code Playgroud)

Write(null)按预期抛出异常.这是一个异步方法:

public async Task WriteAsync(string text)
{
    if (text == null)
        throw new ArgumentNullException("text", "Text must not be null.");

    // async stuff...
}
Run Code Online (Sandbox Code Playgroud)

WriteAsync(null),等待之前不会抛出异常.我应该ArgumentNullExceptionexception标签中指定吗?我认为这会让消费者认为调用WriteAsync可能会抛出ArgumentNullException并写下这样的东西:

Task t; …
Run Code Online (Sandbox Code Playgroud)

.net c# documentation asynchronous

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

我应该在Windows服务中调用基类的方法吗?

在派生时ServiceBase,我是否也应该调用基类的方法?

protected override void OnStart(string[] args)
{
    //
    // The stuff I do when the service starts.
    //

    base.OnStart(args); // Do I need to call this?
}
Run Code Online (Sandbox Code Playgroud)

.net c# service windows-services

14
推荐指数
2
解决办法
2041
查看次数

在C#中迭代字典

var dict = new Dictionary<int, string>();
for (int i = 0; i < 200000; i++)
    dict[i] = "test " + i;
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码迭代这本字典:

foreach (var pair in dict)
    Console.WriteLine(pair.Value);
Run Code Online (Sandbox Code Playgroud)

然后,我用这个迭代它:

foreach (var key in dict.Keys)
    Console.WriteLine(dict[key]);
Run Code Online (Sandbox Code Playgroud)

第二次迭代减少了约3秒.我可以通过两种方法获得键和值.我想知道第二种方法是否有缺点.由于我能找到的评价最高的问题不包括这种迭代字典的方式,我想知道为什么没有人使用它以及它如何更快地工作.

c# iteration dictionary

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

如何使readonly结构XML可序列化?

我有一个只有一个字段的不可变结构:

struct MyStruct
{
    private readonly double number;

    public MyStruct(double number)
        => this.number = number;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过以下方式进行序列化/反序列化:

  • 数据合同序列化器
  • 二进制格式化程序
  • XML序列化程序(编辑:遗忘在原始问题中)
  • Json.NET(不添加Json.NET作为依赖项)

所以结构变成了这样:

[Serializable]
struct MyStruct : ISerializable, IXmlSerializable
{
    private readonly double number;

    public MyStruct(double number)
        => this.number = number;

    private MyStruct(SerializationInfo info, StreamingContext context)
        => this.number = info.GetDouble(nameof(this.number));

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        => info.AddValue(nameof(this.number), this.number);

    XmlSchema IXmlSerializable.GetSchema() => null;

    void IXmlSerializable.ReadXml(XmlReader reader)
    {
        // Necessary evil
        reader.Read();
        this = new MyStruct(double.Parse(reader.Value, CultureInfo.InvariantCulture));
    }

    void IXmlSerializable.WriteXml(XmlWriter writer)
        => writer.WriteString(this.number.ToString(CultureInfo.InvariantCulture)); …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization json.net c#-7.2

13
推荐指数
2
解决办法
949
查看次数