C# 在删除重复项的同时将枚举数组自动映射到另一个枚举

问题描述 投票:0回答:1

我有两个枚举。一个比另一个具有更多的价值。我想在删除缺失值的同时将一个映射到另一个。

public enum Person1ColoursEnum
{
  BlueColour = 1
  RedColour = 2
}
public enum Person2ColoursEnum
{
  Blue = 1
  Red = 2
  Green = 3
  Yellow = 4
  Pink = 5
}
var person2Colours = new[] { 
    Person2ColoursEnum.Blue, 
    Person2ColoursEnum.Red, 
    Person2ColoursEnum.Yellow 
}
var favColours = mapper.Map<Person1ColoursEnum[]>(person2Colours);

我希望结果是 [BlueColour, RedColour]

CreateMap<Person2ColoursEnum, Person1ColoursEnum>()
    .ConvertUsingEnumMapping(opt => opt
        .MapValue(Person2ColoursEnum.Blue, Person1ColoursEnum.BlueColour )
        .MapValue(Person2ColoursEnum.Red, Person1ColoursEnum.RedColour )
        .MapValue(Person2ColoursEnum.Green, default)
        .MapValue(Person2ColoursEnum.Yellow, default)
        .MapValue(Person2ColoursEnum.Pink, default)
);

我能得到的最接近的是上面的结果:[BlueColour, RedColour, 0, 0, 0]

c# automapper
1个回答
0
投票

您可以使用 LINQ 过滤值,然后转换它们。这是一种方法:

  1. 过滤 person2Colours 数组以仅保留
    Person1ColoursEnum
    中存在的值。
  2. 将过滤后的值从
    Person2ColoursEnum
    转换为
    Person1ColoursEnum
    .
var person2Colours = new[] { 
    Person2ColoursEnum.Blue, 
    Person2ColoursEnum.Red, 
    Person2ColoursEnum.Yellow 
};

var favColours = person2Colours
    .Where(p2c => Enum.IsDefined(typeof(Person1ColoursEnum), (int)p2c))
    .Select(p2c => (Person1ColoursEnum)(int)p2c)
    .ToArray();

这种方法有以下好处:

  • 不需要任何第三方库或自定义映射代码。
  • 简洁易懂

也有一些缺点:

  • 它依赖于具有相同整数值的枚举值 对应的颜色。如果值不同,则此方法 不会工作。
  • 它假定枚举具有相同的底层类型(通常
    int
    )。如果他们有不同的基础类型,你需要投 相应地。

另一种方法是使用字典将值从一个枚举映射到另一个枚举:

var person2ToPerson1ColourMap = new Dictionary<Person2ColoursEnum, Person1ColoursEnum>
{
    { Person2ColoursEnum.Blue, Person1ColoursEnum.BlueColour },
    { Person2ColoursEnum.Red, Person1ColoursEnum.RedColour }
};

var favColours = person2Colours
    .Where(p2c => person2ToPerson1ColourMap.ContainsKey(p2c))
    .Select(p2c => person2ToPerson1ColourMap[p2c])
    .ToArray();

这种方法有以下好处:

  • 它不依赖于枚举的整数值相同。
  • 它可以处理具有不同底层类型的枚举。

缺点:

  • 它需要为映射维护一个单独的字典。
  • 比第一种方法稍微冗长。
© www.soinside.com 2019 - 2024. All rights reserved.