小编Tor*_*son的帖子

如何从Expression <Func <MyClass,string >>动态创建Expression <Func <MyClass,bool >>谓词?

我试图追加谓词和我的目标是创建相同的表达式:

Services.Where(s => s.Name == "Modules" && s.Namespace == "Namespace");
Run Code Online (Sandbox Code Playgroud)

我有以下代码:

Expression<Func<Service,string>> sel1 = s => s.Name;
Expression<Func<Service,string>> sel2 = s => s.Namespace;

var val1 = Expression.Constant("Modules");
var val2 = Expression.Constant("Namespace");

Expression e1 = Expression.Equal(sel1.Body, val1);
Expression e2 = Expression.Equal(sel2.Body, val2);
var andExp = Expression.AndAlso(e1, e2);

ParameterExpression argParam = Expression.Parameter(typeof(string), "s");
var lambda = Expression.Lambda<Func<string, bool>>(andExp, argParam);
Run Code Online (Sandbox Code Playgroud)

这将创建以下输出:

s => ((s.Name == "Modules") AndAlso (s.Namespace == "Namespace"))
Run Code Online (Sandbox Code Playgroud)

但是,这是错误的,因为NameNamespace的参数不相同.如果我将其中一个表达式选择器更改为:

Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
Run Code Online (Sandbox Code Playgroud)

输出将是:

s …
Run Code Online (Sandbox Code Playgroud)

c# linq expression-trees linq-expressions

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

增加可读性以使用基于约束的断言来断言IsNotNullOrEmpty

我目前正在重写一些单元测试以使用NUnit 3而不是NUnit 2,并且需要将一些断言更改为基于约束的断言.我有以下断言:

Assert.IsNullOrEmpty(result);
Run Code Online (Sandbox Code Playgroud)

我改为:

Assert.That(result, Is.Null.Or.Empty);
Run Code Online (Sandbox Code Playgroud)

但是,断言时我对可读性并不完全满意IsNotNullOrEmpty:

Assert.That(result, Is.Not.Null.And.Not.Empty);
Run Code Online (Sandbox Code Playgroud)

我目前的建议是创建以下静态类:

public static class Text
{
    public static EmptyConstraint IsNullOrEmpty => Is.Null.Or.Empty;

    public static EmptyConstraint IsNotNullOrEmpty => Is.Not.Null.And.Not.Empty;
}
Run Code Online (Sandbox Code Playgroud)

用法:

Assert.That(result, Text.IsNotNullOrEmpty);
Run Code Online (Sandbox Code Playgroud)

这提供了更好的可读性,但代价是引入了自定义约束.是否存在制定相同断言的标准方法,还是应该继续使用Is.Not.Null.And.Not.Empty

c# nunit unit-testing nunit-3.0

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

Xml架构 - 以任何顺序定义子元素0-*

我想定义一个xml架构,其中元素Connectors具有0-*子元素.序列,关联或消息的任何顺序和0到多次.即

<Connectors>
    <Sequence />
    <Association />
    <Message />
    <Sequence />
    <Sequence />
    <Message />
    <Message />
    <Association />
</Connectors>
Run Code Online (Sandbox Code Playgroud)

我试图定义以下架构,但似乎订单是固定的.

<xs:element name="Connectors">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Association" minOccurs="0" maxOccurs="unbounded" />
            <xs:element ref="Message" minOccurs="0" maxOccurs="unbounded" />
            <xs:element ref="Sequence" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

xml xsd

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

获取Enumerable.DefaultIfEmpty的methodinfo

我正在构建一些Linq Expression并尝试获取MethodInfo IEnumerable.DefaultIfEmpty(http://msdn.microsoft.com/en-us/library/bb360179.aspx).什么似乎是一个简单的任务,但我不知道它为什么不工作.

typeof(Enumerable).GetMethod("DefaultIfEmpty", new[] { typeof(IEnumerable<>) });

typeof(Enumerable).GetMethod("DefaultIfEmpty", new[] { typeof(IEnumerable<>).MakeGenericType(typeof(WorkitemListModel)) });
Run Code Online (Sandbox Code Playgroud)

c# reflection methodinfo

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

如何从C#中的字符串中获取数字

我有一个HTML格式的字符串(1-3 of 3 Trip)如何获得数字3(在旅行前)并将其转换为int.我想将它用作计数

找到这个代码

public static string GetNumberFromStr(string str)
{
  str = str.Trim();
  Match m = Regex.Match(str, @"^[\+\-]?\d*\.?[Ee]?[\+\-]?\d*$");
  return (m.Value);
}
Run Code Online (Sandbox Code Playgroud)

但它只能获得1个数字

c# regex

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

查询数据表字段包含列表<string>中的任何项的行

我是LINQ的新手.
我想查询描述列字符串的所有行(示例值"我今天感觉很幸运.")包含/匹配a中的任何项目List<string> lst.
列表项的示例包含{"lucky","bad","ok"}.
我想通过只使用linq实现,但我混淆了以下方法正确吗?
谢谢.

选项1:
var item =
from a in datatbl.AsEnumerable()
from b in lst
where a.Field<string>("description").contains(b)
select a;

选项2:
var item =
from a in datatbl.AsEnumerable()
where lst.Any(x=> a.Field<string>("description").Contains(x))
select a;

c# linq

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

C# ASP.NET Core API 异步/等待 VS 结果

我对 C# 和任务的最佳实践有点困惑。
当我学习 C# 和任务时,它总是一个等待任务的异步函数。但最近我做了一些研究,发现有些人的说法并非如此。他们还表示,限制 async 和 wait 的使用可以提高性能和 RAM 使用率。

例如,在这篇 Stackoverflow 文章中,它说您不应该总是等待每个任务,但该示例不适用于 ASP.NET API,并且没有任何以前的数据用于获取新数据。 这篇文章也赞成不要总是等待每项任务。但这个例子又是一个正在传递的简单任务。

所以我的问题是当有另一个任务必须等待第二个任务时。您可以使用.Result还是我们使用 async/await 更好。因为我听说.Result正在阻塞当前线程。但我看不出当前线程如何不会被等待阻塞,因为第二个语句需要第一个语句的输出。

没有异步/等待的示例

public Task<User> SaveUser(User user) 
{
    var dbUser = _userRepository.GetByUid(user.Id).Result;
    if(dbUser == null) {
        dbUser = new User();
        dbUser.Id = Guid.NewGuid();
    }
    dbUser.Name = user.Name;

    return _userRepository.Save(dbUser);

}
Run Code Online (Sandbox Code Playgroud)

异步/等待示例

public async Task<User> SaveUser(User user) 
{
    var dbUser = await _userRepository.GetByUid(user.Id);
    if(dbUser == null) {
        dbUser = new User();
        dbUser.Id = Guid.NewGuid();
    } …
Run Code Online (Sandbox Code Playgroud)

c# async-await asp.net-core asp.net-core-webapi

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