首页 > 解决方案 > 在 List 中创建新的模型数组包含每四个索引中的值

问题描述

我需要将包含模型值的新数组添加到使用四个索引分组中存在的值的列表中。

我正在使用下面的代码从相应的数据库表中检索值:

public List<Log> ViewItFilterUseCount()
{
    var ndtms2Utils = new NDTMS2UtilsEntities();

    var valueQuery = (from log in ndtms2Utils.Logs
        where log.Message.Contains("ViewIt - View Data")
        select log);

    List<Log> logList = new List<Log>();

    foreach (var value in valueQuery)
    {
        Log model = new Log();
        model.Id = value.Id;
        model.Date = value.Date;
        model.Thread = value.Thread;
        model.Level = value.Level;
        model.Logger = value.Logger;
        model.Message = value.Message;
        model.Exception = value.Exception;
        logList.Add(model);
    }

    return logList;
}

我需要从出现在 : 符号之后的 Message 变量中提取值,并使用它们为 Message 字段创建一个新值,格式如下:ViewIt - 查看数据 - 用户已选择:messageValue1、messageValue2、messageValue3、messageValue4。

模型中剩余变量的值可以使用 4 组的最后一个索引中的值填充。

表格格式的数据如下所示:

在此处输入图像描述

使用前四行作为示例添加的消息将显示为:

ViewIt - 查看数据 - 用户已选择:正在治疗的客户、阿片类药物、英格兰东部、埃塞克斯。

标签: c#listlinqforeachasp.net-mvc-5

解决方案


这将一次仅将 4 个日志条目分组,并给出一个组合消息作为输出:

public List<Log> ViewItFilterUseCount()
{
    var ndtms2Utils = new NDTMS2UtilsEntities();

    // Query LINQ-to-Entities database for all matching rows
    var valueQuery = ndtms2Utils.Logs.Where((o) => o.Message.StartsWith("ViewIt - View Data")).ToList();

    // Then process client-side
    int index = 0;
    return (from log in valueQuery
            group log by (index++ / 4) into grp
            let log = grp.Last()
            select new Log {
                Id = log.Id,
                Date = log.Date,
                Thread = log.Thread,
                Level = log.Level,
                Logger = log.Logger,
                Message = "ViewIt - View Data - the user has selected: " + string.Join(", ", grp.Select((l) => l.Message.Substring(l.Message.IndexOf(": ") + 2))),
                Exception = log.Exception
            }).ToList();
}

如果传入日志条目的顺序发生轻微变化,则此操作可能会失败,或者缺少条目会导致剩余条目移动。


推荐阅读