小编Hay*_*den的帖子

记录在可枚举相等性上返回 false

测试新的 C# 9 记录,并希望澄清为什么序列相等在记录上不起作用?

假设我有以下代码:

public record Person(string FirstName, string LastName);
Run Code Online (Sandbox Code Playgroud)

以下代码将返回 true 表示相等(这里没什么奇怪的):

var first = new Person("Bruce", "Wayne");
var second = new Person("Bruce", "Wayne");
var result = first == second; // Returns true
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建以下记录:

public record Basket(string[] Items);
Run Code Online (Sandbox Code Playgroud)

我做了一个类似的测试:

var first = new Basket(new[] { "Banana", "Apple" });
var second = new Basket(new[] { "Banana", "Apple" });
var result = first == second;
Run Code Online (Sandbox Code Playgroud)

结果将返回 false。这可以通过定义自己的 Equals 方法来解决:

public record Basket(string[] Items)
{
    public virtual bool Equals(Basket other)
    { …
Run Code Online (Sandbox Code Playgroud)

c# c#-9.0 c#-record-type

7
推荐指数
0
解决办法
3441
查看次数

Android Room 允许 Dao @Query 填充 @Ignore 列

我希望我的 Dao 填充我的 Entity 类中的 @Ignore 列。例如:

实体

@Entity(tableName = "example")
data class Example(
    @PrimaryKey
    val id: Long,
    val value: Int
) {
    @Ignore
    var nextId: Long = 0L
}
Run Code Online (Sandbox Code Playgroud)

@Dao
interface ExampleDao {
    @Query(value = "SELECT *, (id + 1) AS nextId FROM example")
    fun getAllExamples(): List<Example>
}
Run Code Online (Sandbox Code Playgroud)

但是,当构建应用程序时,会生成以下警告: The query returns some columns [nextId] which are not used by com.example.app.Example并且它不会填充nextId.

是否可以在 @Query 中包含 @Ignore 列(如果可以,如何)?如果没有,可以采用哪些策略将表中不存在的列填充到实体类中。

注意:我完全了解这个示例,只要我可以简单地执行以下操作:

@Ignore
val nextId: Long = id + …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room

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

配置流畅断言精度以比较小数

我正在使用 fluid-assertions 和 sqlite 编写单元测试,它存储了糟糕的十进制类型。

我希望所有的小数比较都忽略浮动部分。

有办法做到吗?

谢谢 !

c# fluent-assertions

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

使用 AutoMoq 更改 AutoFixture 的行为以返回 false 方法

假设我有以下界面:

public interface ITeam
{
    bool HasPlayer(IPlayer player);
    void AddPlayer(IPlayer player);
}
Run Code Online (Sandbox Code Playgroud)

我目前有一个测试看起来类似于(使用 AutoMoq):

[Theory]
[MyAutoData]
public void ShouldRosterToTeamWhenPlayerIsNotRostered(Player player, Mock<ITeam> mockedTeam)
{
    player.RosterToTeam(mockedTeam.Object);

    mockedTeam.Verify(team => team.AddPlayer(player), Times.Once);
}
Run Code Online (Sandbox Code Playgroud)

然而,我的代码中的一个先决条件是,调用时HasPlayer必须返回false才能通过测试RosterToTeam

这可以通过创建ICustomization并直接组合正确的行为来解决,例如:

public class TeamCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Customize<Mock<ITeam>>(composer =>
            composer.Do(mock =>
                        mock.Setup(team => team.HasPlayer(It.IsAny<IPlayer>()))
                            .Returns(false)));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望我的测试始终假设布尔方法的默认值为false。我尝试过研究ISpecimenBuilder,但找不到实现此目的的方法,因为它似乎只适用于属性、参数等。

有谁能够向我推荐一种通用设置所有布尔方法在以这种方式创建时默认返回false 的方法吗?

编辑:行为改变背后的罪魁祸首是何时ConfigureMembers = true设置的AutoMoqCustomization

这就是我MyAutoDataAttribute目前的样子:

public …
Run Code Online (Sandbox Code Playgroud)

c# autofixture

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

枚举类型约束返回错误“签名和实现不兼容...”

我一直在尝试遵循MSDN - Constraints (F#)的指南,在具有枚举的通用类型约束的模块中创建类型,如下所示:

type Mapper<'TEnum when 'TEnum : enum<uint32>>() = 
    let dict = new Dictionary<'TEnum, string>()

    member this.Add (key: 'TEnum) (value: string) = 
        dict.Add(key, value)
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

签名和实现不兼容,因为类型参数“TEnum”的声明需要“TEnum:相等”形式的约束

有没有办法修复此代码示例,以便我能够将类型限制为枚举?

f#

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

动态设置for循环的初始化,条件和入/减

目前,我不得不写出多个for-loops执行相同任务的多个,其中的差异在于初始化,条件和for-loops自身内的de /增量.

这是我到目前为止类似的一个例子:

if(some_bool_condition)
{
    for(int i = 0; i < 5; i++)
    {
        // do something
    }
} 
else
{
    for(int i = 10; i >= 5; i--)
    {
        // do same thing
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有可以用来将这些合并for-loops在一起的技巧或技巧?

c c++ for-loop

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

Android-根据ViewModel中的选定项更改过滤LiveData列表

我的一个片段具有一个AndroidViewModel,其中包含一个LiveData列表,而另一个LiveData列表的选定项具有另一个属性。以下是我正在谈论的示例:

class TeamViewModel(app: Application): AndroidViewMode(app) {
    ...

    val selectedTeam = MutableLiveData<Team>()

    val allTeams: LiveData<List<Team>>
        get() = repository.getAllTeams().toLiveData()

    val allPlayers: LiveData<List<Player>>
        get() = repository.getAllPlayers().toLiveData()

    ...
}
Run Code Online (Sandbox Code Playgroud)

注意:返回一个RxJava Flowable List,然后我通过`.toLiveData将其转换为LiveData List getAllTeamsgetAllPlayers

目前,allPlayers代表所有团队的所有球员。我想这样做,以便每当selectedTeam更改值时,它allPlayers就会被过滤掉,只显示来自的玩家selectedTeam

我尝试过的是allPlayers像这样直接过滤:

val allPlayers: LiveData<List<Player>>
    get() = repository.getAllPlayers()
                .flatMap { list -> Flowable.fromIterable(list)
                    .filter {
                        player -> player.team == selectedTeam.value?.team
                    }
                }
                .toList()
                .toFlowable()
                .toLiveData()
Run Code Online (Sandbox Code Playgroud)

但是,您可能会猜到也可能不会猜到,allPlayers无论何时selectedTeam发生更改,它都不会更新过滤器。

反正是有动态改变过滤器allPlayers,只要selectedTeam改变?

编辑

感谢@EpicPandaForce,我得出的最终解决方案如下: …

android kotlin android-livedata

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