根据不同的值从列表创建列表

时间:2016-12-15 04:55:08

标签: c# linq foreach

我有一个以下面4列开头的结果集。他们从存储过程调用回来。

enter image description here

结果有两个不同的ID。

我需要做的是foreach通过每个列表并获取结果集的不同ID(我现在不能使用LINQ,因为它实际上是动态类型),并将行添加到新List<>

因此,在这个例子的情况下,我最终会得到两个List<>。一个,对于Id 119948,有4行,一个用于Id 14765,有3行。

实现此目的的唯一方法是首先通过列表进行操作并获取不同的ID,然后预览不同的列表,然后再次遍历列表并将它们添加到List&lt;&gt;?

2 个答案:

答案 0 :(得分:1)

<强>关于

  

我现在无法使用LINQ,因为它实际上是动态类型

Linq still works with dynamic types

<强>关于

  

如果只是首先通过列表前进并获得明确的方法   id,然后foreach distinct,再次通过列表并添加   他们到列表&lt;&gt;?

,假设我理解您使用动态类型时遇到的问题,可以使用Linq执行以下操作之一:

如果要求输出是列表列表,并且正在执行问题中存储过程的方式导致SqlDataReader,则可以使用Linq执行以下操作(替换为我拥有示例值的值,包括从dataRecord中转换类型:

IEnumerable<IEnumerable<YourType>> yourListOfLists;

using (var connection = new SqlConnection(someConnectionString))
using (var command = new SqlCommand(someStoreProcedureName, connection))
{
    connection.Open();
    command.CommandType = CommandType.StoredProcedure;

    using (var reader = command.ExecuteReader())
    {
        yourListOfLists = reader.Cast<IDataRecord>()
                                 .ToList()
                                 .Select(dataRecord =>
                                 new YourType()
                                 {
                                     VersionNumber = dataRecord.GetInt32(dataRecord.GetOrdinal("VersionNumber")),
                                     Id = dataRecord.GetInt32(dataRecord.GetOrdinal("Id")),
                                     FromType = dataRecord.GetString(dataRecord.GetOrdinal("FromType")),
                                     FromStatusId = dataRecord.GetString(dataRecord.GetOrdinal("FromStatusId"))
                                 })
                                 .GroupBy(youObject => youObject.Id)
                                 .Select(group => group.ToList())
                                 .ToList();
    }
}

如果您真正想要的是基于某些Id的两个不同的列表:

IEnumerable<YourType> listOfId1;
IEnumerable<YourType> listOfId2;

using (var connection = new SqlConnection(someConnectionString))
using (var command = new SqlCommand(someStoreProcedureName, connection))
{
    connection.Open();
    command.CommandType = CommandType.StoredProcedure;

    using (var reader = command.ExecuteReader())
    {
        var combinedList = reader.Cast<IDataRecord>()
                                 .ToList()
                                 .Select(dataRecord =>
                                 new YourType()
                                 {
                                     VersionNumber = dataRecord.GetInt32(dataRecord.GetOrdinal("VersionNumber")),
                                     Id = dataRecord.GetInt32(dataRecord.GetOrdinal("Id")),
                                     FromType = dataRecord.GetString(dataRecord.GetOrdinal("FromType")),
                                     FromStatusId = dataRecord.GetString(dataRecord.GetOrdinal("FromStatusId"))
                                 });

        listOfId1 = combinedList.Where(item => item.Id == 111111).ToList();
        listOfId2 = combinedList.Where(item => item.Id == 222222).ToList();
    }
}

请注意,执行存储过程的方法很可能比本示例中显示的更好。

答案 1 :(得分:1)

  

如果首先通过列表获取并获得不同的ID,然后预先显示不同的唯一方法,再次通过列表并将它们添加到List&lt;&gt;?

想象一下,用颜色将蜡笔分成垃圾箱(垃圾箱可自由制作)。您是否首先浏览所有蜡笔,列出您拥有的颜色,然后再将它们分开?不,你随时将它们分开,根据需要添加更多的垃圾箱。

所以不,你不必在集合上进行两次传递。你只需找到&#34;键&#34;每个项目的价值,看看&#34;桶&#34;已经创建了。如果是,请将其添加到该存储桶。如果没有,请将新存储桶添加到输出集合,并将该项目添加到该存储桶。这基本上是GroupBy所做的。