有没有什么方法可以将项目索引作为每个拆分的分隔符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]
我还需要将结果列表大小作为此函数的参数.
我正在开发一个ac#program,它有一个"IEnumerable users",可以存储400万用户的ID.我需要遍历Ienummerable并每次提取批量1000个ID以在另一个方法中执行某些操作.
如何从Ienumerable开始一次提取1000个ID ...做一些其他事情然后获取下一批1000等等?
这可能吗?
我想把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>.此外,该问题要求填充最后一个子序列.这两个问题密切相关,但并不相同.
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语句中使用枚举器,并使多重性成为我们新结果集的边界.
假设我有一个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).但是,我不想重新启动它 - 事实上,它可能无法重新启动.
那么,有没有办法获取第一个记录,然后是剩余的记录(除了通过将所有值读入新的集合并重新枚举它们)?
我有一个有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) 我有以下代码:
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比我聪明,所以我想知道究竟发生了什么.
如何将从文档中拉出的线条一次限制为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) 我想编写一个for循环,它将遍历现有列表,并在每次迭代时从该列表中取出20个项目.
所以像这样:
我写过这样的话:
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项......如何我可以这样做吗?
我必须从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#的了解不多,也没有帮助我:).
还是要谢谢你的帮助.
我有List<string> Names;,它有70万个名字.如何连接每500个字符串(使用分隔符",")并将它们添加到新字符串List<string> ABC;
所以我想要一个List<string>,这将有1400个连接的字符串.
ABC [0] =前500个名字,ABC [1] =接下来500个名字,依此类推.