C#如何分隔字符串列表并将每个值添加到自己的字符串属性中

时间:2015-04-21 12:19:37

标签: c# database list mapping

我有一个映射文件,用于将值映射到模型以保存到我的数据库。在我的数据库表中,我有6个字段(Key1,Key2,Key3,Key4,Key5,Key6)。 我的模型看起来像这样:

public string Key1 { get; set; }
public string Key2 { get; set; }
public string Key3 { get; set; }
public string Key4 { get; set; }
public string Key5 { get; set; }
public string Key6 { get; set; }

我在映射文件中得到的值如下:

.ForMember(dto => dto.Keywords, opt => opt.MapFrom(src => new List<string> { src.Key1, src.Key2, src.Key3, src.Key4, src.Key5, src.Key6 }.Where(s => !string.IsNullOrEmpty(s))));

但是,我现在想要反过来这样做,以便可以更改值并将其发送回数据库。我想在一行中完成,就像我首先得到列表一样 目前,我必须在列表上执行ElementAtOrDefault(),以便在每个字段中存储每个值,如果它不为空。

我目前的代码:

entity.Key1 = dto.Keywords.ElementAtOrDefault(0) != null ? dto.Keywords[0] : null;
entity.Key2 = dto.Keywords.ElementAtOrDefault(1) != null ? dto.Keywords[1] : null;
entity.Key3 = dto.Keywords.ElementAtOrDefault(2) != null ? dto.Keywords[2] : null;
entity.Key4 = dto.Keywords.ElementAtOrDefault(3) != null ? dto.Keywords[3] : null;
entity.Key5 = dto.Keywords.ElementAtOrDefault(4) != null ? dto.Keywords[4] : null;
entity.Key6 = dto.Keywords.ElementAtOrDefault(5) != null ? dto.Keywords[5] : null;

有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以为IList<T>创建一个扩展方法来帮助您:

public static T ValueOrDefault<T>(this IList<T> source, int index)
{
    return source.Count > index ? source[index] : default(T);
}

使用如下:

entity.Key1 = dto.Keywords.ValueOrDefault(0);

我无法看到许多其他简化方法,这些方法不会降低可读性。

答案 1 :(得分:1)

你可以列出一系列采用DTO和分配的函数,并将循环“折叠”成一行:

private static Func<MyDto,string,string>[] Setters = new Func<MyDto,string,string>[] {
    (dto, s) => dto.Key1=s
,   (dto, s) => dto.Key2=s
,   (dto, s) => dto.Key3=s
,   (dto, s) => dto.Key4=s
,   (dto, s) => dto.Key5=s
,   (dto, s) => dto.Key6=s
};

有了这个声明,你可以这样做:

dto.Keywords.Zip(Setters, (str, setter) => setter(entity, str)).ToList();

ToList()的调用强制枚举对Zip的调用,entity在枚举列表时执行Keywords成员的分配。到达列表末尾时,呼叫停止。

这假设KeyXYZ中的字符串是非空且非空的。

请注意,如果列表短于6,则剩余的null将保留您之前分配给它们的值。如果您想强制将Concat分配给剩余的值,请使用dto.Keywords // This line adds nulls for missing items .Concat(Enumerable.Repeat(null, Math.Max(Setters.Length-dto.Keywords.Length, 0))) .Zip(Setters, (str, setter) => setter(entity, str)) .ToList(); 方法,如下所示:

Math.Max(..., 0)

Key的调用可以为列表中的项目数量多于DTO中{{1}}项的情况添加保护。