1

我有一个单项数组,我将其与更新的项数组进行比较以确定更改列的不同列表。它正在工作。

但是我需要从这一行中构建两个对象,因为我需要将两个对象发送到我用来发送电子邮件的 API。一个用于旧值,一个用于新值。我尝试了两种不同的方式:

var updates = currentRow.ItemArray
    .Select((o, i) => new { Row = o, Index = i })
    .Where(r => (r.Row == null && updatedRow[r.Index] != null)
            || (r.Row != null && updatedRow[r.Index] != null
            && !r.Row.Equals(updatedRow[r.Index])))
        .Select(r => new AppServices.NotificationData[]
        {
            new AppServices.NotificationData
            {
                Key = string.Format("{0}OldValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(currentRow[r.Index])
            },
            new AppServices.NotificationData
            {
                Key = string.Format("{0}NewValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(updatedRow[r.Index])
            }                        
        });

但实际上,正如预期的那样,老实说,这给了我一个可枚举的数组。我也试过这样:

var updates = currentRow.ItemArray
    .Select((o, i) => new { Row = o, Index = i })
    .Where(r => (r.Row == null && updatedRow[r.Index] != null)
            || (r.Row != null && updatedRow[r.Index] != null
            && !r.Row.Equals(updatedRow[r.Index])))
        .Select(r => new AppServices.NotificationData
        {
            Key = string.Format("{0}OldValue",
                columns[r.Index].ColumnName.EmailTemplateName(type)),
            Value = Convert.ToString(currentRow[r.Index])
        })
        .Select(r => new AppServices.NotificationData
        {
            Key = string.Format("{0}NewValue",
                columns[r.Index].ColumnName.EmailTemplateName(type)),
            Value = Convert.ToString(updatedRow[r.Index])
        });

但这里的问题是第二个从前一个选择Select中传入对象,所以实际上不是项目数组。NotificationDatar

这里currentRowupdatedRow是分别DataRow代表旧数据和新数据的对象。

我确信有办法得到我所追求的,我只是不知道如何。

那么,我如何获得一个Select为返回单一类型而构建的 ,以返回同一对象的两个实例,以便最终可枚举为IEnumerable<NotificationData>

4

2 回答 2

6

在第一个查询中使用SelectMany而不是:Select

var updates = currentRow.ItemArray
    .Select((o, i) => new { Row = o, Index = i })
    .Where(r => (r.Row == null && updatedRow[r.Index] != null)
            || (r.Row != null && updatedRow[r.Index] != null
            && !r.Row.Equals(updatedRow[r.Index])))
        .SelectMany(r => new AppServices.NotificationData[]
        {
            new AppServices.NotificationData
            {
                Key = string.Format("{0}OldValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(currentRow[r.Index])
            },
            new AppServices.NotificationData
            {
                Key = string.Format("{0}NewValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(updatedRow[r.Index])
            }                        
        });

它会将您压扁IEnumerable<IEnumerable<T>>IEnumerable<T>.

于 2013-09-10T13:01:02.020 回答
0

如果您想要每行创建两个对象,然后能够将这两个对象一起发送到您的 API,那么我认为最好的方法是使用匿名类型。

var updates = currentRow.ItemArray
    .Select((o, i) => new { Row = o, Index = i })
    .Where(r => (r.Row == null && updatedRow[r.Index] != null)
            || (r.Row != null && updatedRow[r.Index] != null
            && !r.Row.Equals(updatedRow[r.Index])))
        .Select(r => new {
            NotificationForServiceA = new AppServices.NotificationData({
                Key = string.Format("{0}OldValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(currentRow[r.Index])
            }),
            NotificationForServiceB = new AppServices.NotificationData({
                Key = string.Format("{0}NewValue",
                    columns[r.Index].ColumnName.EmailTemplateName(type)),
                Value = Convert.ToString(updatedRow[r.Index])
            })
        });

然后你可以这样使用它:

var oneItem = updates.FirstOrDefault();
myApi(oneItem.NotificationForServiceA, oneItem.NotificationForServiceB);

如果您想要每行创建两个 NotificationData 并将它们合并/展平为一个可枚举,那么您应该使用它SelectMany来执行该操作。请参阅 MarcinJuraszek 的回答来做到这一点。

于 2013-09-10T13:01:20.153 回答