小编Dav*_* S.的帖子

使特定的内部函数对另一个程序集可见(即并非所有内部都可见)

可以[assembly: InternalsVisibleTo("NameOfOtherAssembly")]在 AssemblyInfo.cs 中指定。

但是是否可以将其限制为特定的内部功能?

例如,是否有可以应用于每个功能的属性?

[InternalVisibleTo("NameOfOtherAssembly")]
internal void ShouldBeVisible()
{}

internal void ShouldNotBeVisible()
{}
Run Code Online (Sandbox Code Playgroud)

如果没有,有没有其他方法可以做到这一点?

c# internalsvisibleto internal

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

字典支持重复,多维键?

我有一个List<Thing> things,其中一些Thing需要通过看两个变量的组合经常检索小号T1 f1T2 f2,这是值类型.我现在这样做的方式很简单things.Where(t => t.Field1 == f1 && t.Field2 == f2).但是,我经常进行极其多的查找,并且需要更有效的方法.

幸运的是,things不需要删除或添加元素,所以我想在构造中解析列表并添加到Dictionary<T1, Lookup<T2, Thing>>.但是,这感觉很麻烦,特别是添加了解析.如果我需要查找更多字段,它会变得非常毛茸茸.三个字段看起来像Dictionary<T1, Dictionary<T2, Lookup<T3, Thing>>>.

我的下一个想法是做一个Lookup<Tuple<T1,T2,T3,...>,Thing>.但在这种情况下,我不确定密钥是否真的有效,因为Tuple是一个引用类型.

即使我做了一个Lookup<ValueType<T1,T2,T3,...>,Thing> things,查找语句将things[new ValueType<T1,T2,T3,...>(f1, f2, f3, ...)]是非常难看的(我仍然不确定我是否可以信任这些键).

有没有更优雅的解决方案,这保持哈希表的性能优势,我可以简单地输入类似的东西IEnumerable<Thing> found = things[f1, f2, f3, ...];

.net c# dictionary

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

枚举ILookup结果的成本?最好总是使用Dictionary <TKey,List <TElement >>?

ILookup<TKey,TElement> lookup经常从中获取元素并使用LINQ或者迭代它们foreach.我看起来像这样IEnumerable<TElement> results = lookup[key];.

因此,results每次使用查找结果时都需要至少枚举一次(如果我先不使用.ToList(),那么如果我多次迭代则更多).

即使它不是"干净",使用a也不是更好(性能方面)Dictionary<TKey,List<TElement>>,所以一个键的所有结果只在字典的构造中枚举?ToList()有多累赘?

.net c#

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

防止代码的定时部分中的上下文切换(或者测量然后减去实际上没有花费在线程中的时间)

我有一个多线程应用程序,在某段代码中我用a Stopwatch来衡量一个操作的时间:

MatchCollection matches = regex.Matches(text); //lazy evaluation
Int32 matchCount;
//inside this bracket program should not context switch
{
    //start timer
    MyStopwatch matchDuration = MyStopwatch.StartNew();
    //actually evaluate regex
    matchCount = matches.Count;
    //adds the time regex took to a list
    durations.AddDuration(matchDuration.Stop());
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是如果程序在秒表启动时将控制切换到另一个其他线程,那么定时持续时间将是错误的.在上下文切换回此部分之前,另一个线程可以完成任何工作量.

请注意,我不是在询问锁定,这些都是局部变量,因此不需要这样做.我只想让定时部分连续执行.

编辑:另一个解决方案可能是减去上下文切换时间,以获得在定时部分完成工作的实际时间.不知道是否可能.

c# performance multithreading timing context-switch

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

C#LINQ to Entities无法识别方法'Boolean'

我在lambda语法中有以下linq表达式:

var myValue = 6;
var from = 2;
var to = 8;

var res = MyList.Where(m => m.person.Id == person.Id
                         && IsBetween(myValue, from, to))
                .Select(x => new Person { blah blah blah })
                .ToList());
Run Code Online (Sandbox Code Playgroud)

IsBetween是一个简单的通用助手方法,看看我之间是否有东西:

public bool IsBetween<T>(T element, T start, T end)
{
    return Comparer<T>.Default.Compare(element, start) >= 0
        && Comparer<T>.Default.Compare(element, end) <= 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我收到了这个错误,我不知道如何解决它:

LINQ to Entities无法识别方法'Boolean IsBetween [Decimal](System.Decimal,System.Decimal,System.Decimal)'方法,并且此方法无法转换为商店表达式.

c# linq-to-entities

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

C# - 如何检查Type是否具体?

我有一个类型的集合,我想过滤掉每个不具体的类型.

我可以看到我可以检查isAbstract和isInterface以捕获大多数非混凝土,但这会错过任何东西吗?

是否有"isConcrete"属性?

c# types

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

switch 语句使用哪个字符串比较器?

执行语句时如何比较字符串switch?线程/计算机的当前文化是否会影响switch评估?我养成了在比较字符串时总是指定比较器的习惯,因此如果能够确认这一点那就太好了。

我怀疑是这样StringComparer.Ordinal,但我找不到任何相关文档。

c# string cultureinfo string-comparison switch-statement

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

在不访问UI线程的情况下在BackgroundWorker中获取"UnauthorizedAccessException"

我在背景工作者身上做了一些繁重的工作,所以它不会影响我的Silverlight UI线程.但是,在DoWork函数中,我遇到了这个异常:

UnauthorizedAccessException "无效的跨线程访问".

我知道我无法从BackgroundWorker访问UI线程,但是,此行发生此异常:

  ListBoxItem insert = new ListBoxItem();
Run Code Online (Sandbox Code Playgroud)

怎么访问我的ui线程?

这是我将其缩小到的实际代码段.我基本上正在创建listboxitems,我想插入sourceList列表框:

void FillSourceList()
{
    busyIndicator.IsBusy = true;
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (sender, args) =>
        {
            List<ListBoxItem> x = new List<ListBoxItem>();
            for (int i = 0; i < 25; i++ )
            {
                ListBoxItem insert = new ListBoxItem(); //<---Getting exception here
                insert.Content = "whatever";
                x.Add(insert);
            }
            args.Result = x;
        };
    bw.RunWorkerCompleted += (sender, args) =>
        {
            foreach (ListBoxItem insert in (List<ListBoxItem>)(args.Result))
                sourceList.Items.Add(insert);
            busyIndicator.IsBusy = false;
        }; …
Run Code Online (Sandbox Code Playgroud)

c# asp.net silverlight

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

如何确保任务启动并安全启动它,如果没有?

我从一个IEnumerable<Task> tasks我无法控制的地方得到一个.我不知道,如果使用手动创建的任务new Task,Task.Run或者如果他们是一个异步方法调用的结果async Task DoSomethingAsync().

如果我这样做await Task.WhenAll(tasks),我冒着无限期的风险,因为可能没有启动一个或多个任务.

我不能这样做tasks.ForEach(t => t.Start()),因为那样我将得到一个InvalidOperationException"如果它来自一个异步方法调用(已经启动),则可能无法在promise风格的任务上调用".

我不能这样做,await Task.WhenAll(tasks.Select(t => Task.Run(async () => await t)))因为每个人t仍然只是等待它才开始.

我假设解决方案与检查每个任务StatusStart()基于此有关,但我也认为它可能很棘手,因为状态可能随时改变,对吧?如果这仍然是要走的路,那么检查哪些状态是正确的,我应该担心哪些线程问题?

非工作案例:

//making an IEnumerable as an example, remember I don't control this part
Task t = new Task( () => Console.WriteLine("started"));
IEnumerable<Task> tasks = new[] {t};

//here I receive the tasks
await Task.WhenAll(tasks);//waits forever because t is not started
Run Code Online (Sandbox Code Playgroud)

工作案例示例:

//calls …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task async-await

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

如何强制为 null 值调用 JsonConverter.WriteJson()

我想用一些元数据将一些属性包装在 JSON 对象中,无论它是否为空。但是,JsonConverter.WriteJson如果属性为 ,则不会调用我的自定义覆盖null

当属性不为空时我得到什么:

{"Prop":{"Version":1, "Object":{"Content":"abc"}}}
Run Code Online (Sandbox Code Playgroud)

当它为空时我得到什么:

{"Prop":null}
Run Code Online (Sandbox Code Playgroud)

当它为空时我想要什么:

{"Prop":{"Version":1, "Object":null}}
Run Code Online (Sandbox Code Playgroud)

由于WriteJson从未被要求提供空值,我没有机会控制这种行为。有什么办法可以强制这样做吗?

请注意,我想知道这是否可以与转换器或合约解析器等一起使用,我不能/不想更改MyContentWrap类(见下文)。

class VersioningJsonConverter : JsonConverter
{
    //Does not get called if value is null !!
    public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("v");
        writer.WriteValue(1);
        writer.WritePropertyName("o");
        if(value == null)
        {
            //never happens
            writer.WriteNull();
        }
        else
        {
            writer.WriteStartObject();
            writer.WritePropertyName("Content");
            writer.WriteValue((value as MyContent).Content);                
            writer.WriteEndObject();
        }
        writer.WriteEndObject();
    }
    public override Object ReadJson(JsonReader reader, Type objectType, …
Run Code Online (Sandbox Code Playgroud)

c# json.net

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