相关疑难解决方法(0)

使用LINQ将列表拆分为子列表

有没有什么方法可以将项目索引作为每个拆分的分隔符List<SomeObject>分成几个单独的列表SomeObject

让我举例说明:

我有一个List<SomeObject>,我需要一个List<List<SomeObject>>List<SomeObject>[],所以这些结果列表中的每一个将包含一组3个原始列表项(顺序).

例如.:

  • 原始清单: [a, g, e, w, p, s, q, f, x, y, i, m, c]

  • 结果列表: [a, g, e], [w, p, s], [q, f, x], [y, i, m], [c]

我还需要将结果列表大小作为此函数的参数.

c# linq data-structures

361
推荐指数
18
解决办法
19万
查看次数

如何批量循环IEnumerable

我正在开发一个ac#program,它有一个"IEnumerable users",可以存储400万用户的ID.我需要遍历Ienummerable并每次提取批量1000个ID以在另一个方法中执行某些操作.

如何从Ienumerable开始一次提取1000个ID ...做一些其他事情然后获取下一批1000等等?

这可能吗?

c# ienumerable

73
推荐指数
7
解决办法
5万
查看次数

将IEnumerable <T>拆分为固定大小的块(返回IEnumerable <IEnumerable <T >>,其中内部序列具有固定长度)

我想把IEnumerable<T>它分成固定大小的块.

我有这个,但由于所有列表创建/复制,它似乎不优雅:

private static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> items, int partitionSize)
{
    List<T> partition = new List<T>(partitionSize);
    foreach (T item in items)
    {
        partition.Add(item);
        if (partition.Count == partitionSize)
        {
            yield return partition;
            partition = new List<T>(partitionSize);
        }
    }
    // Cope with items.Count % partitionSize != 0
    if (partition.Count > 0) yield return partition;
}
Run Code Online (Sandbox Code Playgroud)

有没有更惯用的东西?

编辑:虽然这已被标记为Divide数组的副本到子序列数组的数组,但它不是 - 该问题涉及拆分数组,而这是关于IEnumerable<T>.此外,该问题要求填充最后一个子序列.这两个问题密切相关,但并不相同.

c# linq ienumerable

44
推荐指数
5
解决办法
3万
查看次数

Linq每次迭代选择5项

Linq每次根据我们的枚举器选择5项

我们的列表例如"theList"100个项目,想要浏览列表并在每次迭代中选择5个项目,

示例代码,我们希望将其更改为我们期望的结果:

        theList = dt.AsEnumerable()
            .Select(row => new CustItem
            {
                Name = row.Field<string>("tName"),
                Title = row.Field<string>("tTitle"),
            }).ToList();
Run Code Online (Sandbox Code Playgroud)

我们应该在一个循环中迭代它并且每次处理所选择的5个项目,或者将它传递给我们的其他方法:

类似的东西:

for (int i=0; i < 20 ; i++)
Run Code Online (Sandbox Code Playgroud)

我想"i"linq select语句中使用枚举器,并使多重性成为我们新结果集的边界.

c# linq

34
推荐指数
3
解决办法
2万
查看次数

我可以从枚举中获取前n个元素,然后仍然使用枚举的其余部分吗?

假设我有一个IEnumerable<T>,我想获取第一个元素并将其余元素传递给其他代码.我可以使用前n个元素Take(n),但是如何在不导致枚举重新启动的情况下访问其余元素?

例如,假设我有一个ReadRecords接受CSV文件中的记录的方法IEnumerable<string>.现在假设在该方法中,我想读取第一个记录(标题),然后将剩余的记录传递给ReadDataRecords也采用的方法IEnumerable<string>.像这样:

void ReadCsv(IEnumerable<string> records)
{
    var headerRecord = records.Take(1);
    var dataRecords = ???

    ReadDataRecords(dataRecords);
}

void ReadDataRecords(IEnumerable<string> records)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我准备重新开始枚举,那么我可以使用dataRecords = records.Skip(1).但是,我不想重新启动它 - 事实上,它可能无法重新启动.

那么,有没有办法获取第一个记录,然后是剩余的记录(除了通过将所有值读入新的集合并重新枚举它们)?

.net c# linq

8
推荐指数
1
解决办法
704
查看次数

将数据表拆分为多个固定大小的表

我有一个有1123条记录的数据表.我想将此表拆分为5个固定大小的单独数据表.每张表的大小限制为225.

因此产生的数据表的大小将是:

DT1 : 225 rows
DT2 : 225 rows
DT3 : 225 rows
DT4 : 225 rows
DT5 : 223 rows (remaining rows)
Run Code Online (Sandbox Code Playgroud)

我能找到如何基于使用LINQ列值拆分数据表在这里.

我还发现了一种分裂的数据表到多个表在这里.想知道是否有更好的方法来做到这一点.从链接发布代码:

private static List<DataTable> SplitTable(DataTable originalTable, int batchSize)
{
     List<DataTable> tables = new List<DataTable>();
     int i = 0;
     int j = 1;
    DataTable newDt = originalTable.Clone();
   newDt.TableName = "Table_" + j;
   newDt.Clear();
    foreach (DataRow row in originalTable.Rows)
    {
         DataRow newRow = newDt.NewRow();
         newRow.ItemArray = row.ItemArray;
         newDt.Rows.Add(newRow);
         i++;
         if (i == batchSize) …
Run Code Online (Sandbox Code Playgroud)

c# linq datatable

8
推荐指数
1
解决办法
2万
查看次数

"获得处置关闭"是什么意思?

我有以下代码:

public void DequeueRecipe(AuthIdentity identity, params Guid[] recipeIds)
{
   using (var session = GetSession())
   {
      var recipes = (from r in recipeIds select new Models.Recipes {RecipeId = r}).ToArray();

      var dbRecipes = session.QueryOver<Models.QueuedRecipes>()
         .Where(Expression.Eq("UserId", identity.UserId))
         .Where(Expression.InG("Recipe", recipes))
         .List<Models.QueuedRecipes>();

      using (ITransaction transaction = session.BeginTransaction())
      {
         dbRecipes.ForEach(r => session.Delete(r)); // <-- Warning
         transaction.Commit();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

reSharper给了我警告:

获得处置关闭

在线上:

dbRecipes.ForEach(r => session.Delete(r));
Run Code Online (Sandbox Code Playgroud)

(session变量以下划线标出为罪魁祸首).

虽然这是真的,该ForEach方法采用lamba表达式,在变量周围创建一个闭包session,我没有看到在执行此代码时可能会被处理的方式.也许reSharper认为ForEach可以并行执行某种任务,或者将其保存Action<>一段时间,因此从技术上讲,它可能会在内存中仍然可以访问匿名函数时被处理掉.

我安全忽略这个警告吗?有没有办法可以重新格式化我的代码以防止出现此警告?这段代码确实存在危险吗?

我习惯于reSharper比我聪明,所以我想知道究竟发生了什么.

c# resharper closures

7
推荐指数
1
解决办法
8062
查看次数

如何将文本字符串数组的数量限制为15

如何将从文档中拉出的线条一次限制为15行.现在它一次显示所有行.谢谢.

class Program {
  static void Main(string[] args) {
    string[] lines = System.IO.File.ReadAllLines(
        @"C:\Users\chri749y\Documents\Skrive til fil\Testprogram.txt");

    foreach (string line in lines) {
        Console.WriteLine("{0}", line);
    }

    Console.ReadKey();
  }
}
Run Code Online (Sandbox Code Playgroud)

c#

4
推荐指数
1
解决办法
70
查看次数

对于每次跳过20个项目的循环

我想编写一个for循环,它将遍历现有列表,并在每次迭代时从该列表中取出20个项目.

所以像这样:

  • 如果过滤列表包含让我们说68项......
  • 前3个循环每个需要20次,然后在最后的第4次迭代中,它将占用列表中的8个项目中的其余项目...

我写过这样的话:

var allResponses= new List<string>();
for (int i = 0; i < filteredList.Count(); i++)
{
    allResponses.Add(GetResponse(filteredList.Take(20).ToList()));
}
Run Code Online (Sandbox Code Playgroud)

假设filteredList是包含68个项目的列表.我认为这不是一种方法,因为我不想循环到集合大小,但不是68次,它应该是4次,每次我从列表中取出20项......如何我可以这样做吗?

c# for-loop list c#-4.0

3
推荐指数
1
解决办法
901
查看次数

将一个int数组拆分为C#中几个int数组的列表

我必须从python语言转换为C#的一些代码,我在其中的一部分遇到了困难.

def split_data(seq, length):
    return [seq[i:i + length] for i in range(0, len(seq), length)]

print(split_data([4,5,6,8,5],2))
Run Code Online (Sandbox Code Playgroud)

此代码的目的是在参数中提供一个int数组,并将其拆分为length参数的数组.例如,此打印的结果将是:[[4, 5], [6, 8], [5]]

问题是我需要在C#中拥有相同的东西.所以我开始创建一个List<int[]>.我知道如何在其中添加int []但我不知道如何在Python中拆分它们,尤其是使用此长度参数.

我尝试使用for,foreach循环甚至IEnumerable来实现它,但我无法使其工作

也许有一种非常简单的方法来完成它或者我还没注意到的东西.我对C#的了解不多,也没有帮助我:).

还是要谢谢你的帮助.

c# python arrays

3
推荐指数
1
解决办法
90
查看次数

如何将一个List <string>中的字符串连接到另一个?

我有List<string> Names;,它有70万个名字.如何连接每500个字符串(使用分隔符",")并将它们添加到新字符串List<string> ABC;

所以我想要一个List<string>,这将有1400个连接的字符串.

ABC [0] =前500个名字,ABC [1] =接下来500个名字,依此类推.

c#

1
推荐指数
2
解决办法
146
查看次数