相关疑难解决方法(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万
查看次数

Skip的性能(以及类似功能,如Take)

我刚看了.NET Framework 的Skip/ Takeextension方法的源代码(在IEnumerable<T>类型上),发现内部实现正在使用该GetEnumerator方法:

// .NET framework
    public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count)  
    {
        if (source == null) throw Error.ArgumentNull("source"); 
        return SkipIterator<TSource>(source, count); 
    }

    static IEnumerable<TSource> SkipIterator<TSource>(IEnumerable<TSource> source, int count) 
    {
        using (IEnumerator<TSource> e = source.GetEnumerator()) 
        {
            while (count > 0 && e.MoveNext()) count--;
            if (count <= 0) 
            { 
                while (e.MoveNext()) yield return e.Current;
            } 
        } 
    }
Run Code Online (Sandbox Code Playgroud)

假设我有IEnumerable<T>1000个元素(底层类型是List<T>).如果我正在做list.Skip(990)会怎么样.拿(10)?在进入最后十个元素之前,它是否会通过990首元素进行迭代?(这就是我的理解).如果是,那么我不明白为什么微软没有实现这样的Skip方法:

    // Not tested... just to show the …
Run Code Online (Sandbox Code Playgroud)

c# linq performance ienumerable skip-take

21
推荐指数
1
解决办法
6683
查看次数

LINQ:根据重量/大小将列表拆分为组

我有很多使用LINQ的例子,如何根据每个列表中的最大项将列表划分为子列表.但在这种情况下,我有兴趣使用sizemb作为权重来跳转子列表 - 每个列表的最大总文件大小为9mb.

    public class doc
    {
        public string file;
        public int sizemb;
    }

    var list = new List<doc>()
    {
         new doc { file = "dok1", sizemb = 5 },
         new doc { file = "dok2", sizemb = 5 },
         new doc { file = "dok3", sizemb = 5 },
         new doc { file = "dok4", sizemb = 4 },
    };

    int maxTotalFileSize = 9;
Run Code Online (Sandbox Code Playgroud)

然后,上面的清单应分为3个清单.如果任何"文件"超过9mb,则应该在他们自己的列表中.

我在这里做了一个非LINQ版本:

        var lists = new List<List<doc>>();
        foreach (var item in list)
        {
            //Try and …
Run Code Online (Sandbox Code Playgroud)

c# linq

6
推荐指数
1
解决办法
1123
查看次数

对于每个第N个值,C#将1D数组拆分为2D数组

我有一维一维的数组:

int[] array = { 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31, 32,33, 34,40,41,42,43, 44};
Run Code Online (Sandbox Code Playgroud)

我想将这个1D数组划分为4行5列的2D数组,其中前5个值进入第1行,后5个进入第2行,依此类推.最终结果应如下所示:

array2D:

[[10, 11, 12, 13, 14]
[20, 21, 22, 23, 24]
[30, 31, 32, 33, 34]
[40, 41, 42, 43, 44]]
Run Code Online (Sandbox Code Playgroud)

实际上,阵列将更长(可能超过100行),但列数为5,行数可以分为5.我已经简化了例如.这是我到目前为止所尝试的:

int[] array = { 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31, 32,33, 34,40,41,42,43, 44};
int[,] array2D = new int[(array.Length/5),5];

int count_0 = 1;
int count_1 = 1;
int count_2 = 1;
int …
Run Code Online (Sandbox Code Playgroud)

.net c# arrays winforms

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

根据项目长度拆分列表<T>

我有一个列表,Message以及他们的项目长度size,this.Size = JsonConvert.SerializeObject(Data).Length;.

public class Data
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Message
{
    public Data Data { get; set; }
    public int Size { get; set; }

    public Message(Data Data)
    {
        this.Data = Data;
        this.Size = JsonConvert.SerializeObject(Data).Length;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有下面的数据集,我想将列表拆分成多个列表,每个列表应该只有50个字节(例如).

注 - 以 50为例,我的实际大小为1 MB,没有单个消息大于1MB

我试过下面,但是如何计算总大小并按照chunksize去分组,

.GroupBy(x => x.ItemSize / chunkSize)
Run Code Online (Sandbox Code Playgroud)

还是以不同的方式?

var messages = new List<Message>
{
    new Message(new Data{ …
Run Code Online (Sandbox Code Playgroud)

c#

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

为什么 Enumerable 不获取下一批,而是总是获取前 3 项

我正在做一个 POC,将字符串列表分成批次并异步处理每个批次。但是当我运行该程序时,它总是采用第一组项目(根据批量大小为 3)。那么任何人都可以帮助我如何移动到下一组项目。 Take是我写的一个扩展方法。我尝试使用async/await模式。

提前致谢

public class Program
{
    public static async Task Main(string[] args)
    {
        var obj = new Class1();
        List<string> fruits = new()
            {
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10"
            };
        
        await Class1.Start(fruits);
        Console.ReadLine();
    }
}

public class Class1
{
    private const int batchSize = 3;
    public static async Task Start(List<string> fruits)
    {
        if (fruits == null)
            return;

        var e = fruits.GetEnumerator();
        while (true)
        {    
            var batch = e.Take(3); // always …
Run Code Online (Sandbox Code Playgroud)

c# async-await .net-core asp.net-core

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

将列表或集合拆分为块

我有一个程序,将文件的内容读入某种列表或数组.此列表/数组可以包含任意数量的项目.我需要将它分成更小的组,每组50个项目,然后对每个组中的每个项目进行一些处理.

List<string> stuffFromFile = new List<string>();

while ((line = fileReader.ReadLine()) != null)
      {
           stuffFromFile.Add(line);
      }
Run Code Online (Sandbox Code Playgroud)

我一直在网上查看一些关于如何分块的例子,但说实话,我并不真正理解这些例子,其中一些似乎过于复杂.我只需要一些简单的东西,将原始的项目列表分组/拆分/分成50个组,然后让我遍历每个组中的每个项目,直到处理完成.

读入的项目总数很可能不是我可以均匀划分50的数字,因此最后一组最有可能包含少于50个项目,但仍然需要像其他项目一样进行处理.

有人可以帮忙吗?这听起来应该很简单,但我真的不知道该怎么做.我已经看到了使用LINQ的例子,但我也不理解它.

c# arrays split list

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