C# 要合并的列表大小不等

C# 要合并的列表大小不等,c#,list,merge,C#,List,Merge,我搜索了以下类似的情况,但没有成功 我有两个列表,列表A和列表B。 列表A由10个从仅包含字符串的ClassA创建的对象组成。 列表B由100个从只包含小数的ClassB创建的对象组成 列表A是标题信息。 列表B是数据信息 这两个列表之间的关系是: Row 1 of list A corresponds to rows 1-10 of list B. Row 2 of list A corresponds to rows 11-20 of list B. Row 3 of list A corr

我搜索了以下类似的情况,但没有成功

我有两个列表,列表A和列表B。
列表A由10个从仅包含字符串的ClassA创建的对象组成。
列表B由100个从只包含小数的ClassB创建的对象组成

列表A是标题信息。
列表B是数据信息

这两个列表之间的关系是:

Row 1 of list A corresponds to rows 1-10 of list B.
Row 2 of list A corresponds to rows 11-20 of list B.
Row 3 of list A corresponds to rows 21-30 of list B.
等等

如何组合这两个列表,以便在控制台上显示它们时,用户将看到一个标题行,后面紧跟着相应的10个数据行


如果以前有人回答过,我很抱歉

这里有一些代码可以满足您的请求-我将找到分区扩展的链接,因为我在代码中再也找不到它了:

void Main()
{
    List<string> strings = Enumerable.Range(1,10).Select(x=>x.ToString()).ToList();
    List<decimal> decimals = Enumerable.Range(1,100).Select(x=>(Decimal)x).ToList();

    var detailsRows = decimals.Partition(10)
                              .Select((details, row) => new {HeaderRow = row, DetailsRows = details});

    var headerRows = strings.Select((header, row) => new {HeaderRow = row, Header = header});

    var final = headerRows.Join(detailsRows, x=>x.HeaderRow, x=>x.HeaderRow, (header, details) => new {Header = header.Header, Details = details.DetailsRows});
}

public static class Extensions
{
    public static IEnumerable<List<T>> Partition<T>(this IEnumerable<T> source, Int32 size)
    {
        for (int i = 0; i < Math.Ceiling(source.Count() / (Double)size); i++)
            yield return new List<T>(source.Skip(size * i).Take(size));
    }
}    

好的,应该行了。如果我有什么不对劲,请告诉我

List<ClassA> listA = GetListA()// ...
List<ClassB> listB = GetListA()// ...


if(listB.Count % listA.Count != 0)     
      throw new Exception("Unable to match listA to listB");

var datasPerHeader = listB.Count / listA.Count;

for(int i = 0; i < listA.Count;i++)
{
    ClassA header = listA[i];
    IEnumerable<ListB> datas = listB.Skip(datasPerHeader*i).Take(datasPerHeader);
    Console.WriteLine(header.ToString());
    foreach(var data in datas)
    {
          Console.WriteLine("\t{0}", data.ToString());
    } 
}
List listA=GetListA()/。。。
List listB=GetListA()/。。。
如果(listB.Count%listA.Count!=0)
抛出新异常(“无法将listA与listB匹配”);
var datasPerHeader=listB.Count/listA.Count;
for(int i=0;i
最简单的方法可能是这样:

var listA = new List<string>() { "A", "B", "C", ... }
var listB = new List<decimal>() { 1m, 2m, 3m, ... }
double ratio = ((double)listA.Count) / listB.Count;
var results = 
    from i in Enumerable.Range(0, listB.Count)
    select new { A = listA[(int)Math.Truncate(i * ratio)], B = listB[i] };
当然,如果您知道对于
listA
中的每个项目,
listB
中总会有10个项目,您可以将其简化为:

var results = 
    from i in Enumerable.Range(0, listB.Count)
    select new { A = listA[i / 10], B = listB[i] };
或使用流利的语法:

double ratio = ((double)listA.Count) / listB.Count;
var results = Enumerable.Range(0, listB.Count)
    .Select(i => new { A = listA[(int)Math.Truncate(i * ratio)], B = listB[i] });
var results = Enumerable.Range(0, listB.Count)
    .Select(i => new { A = listA[i / 10], B = listB[i] });
这将返回一个结果集,如

{ { "A", 1 }, 
  { "A", 2 }, 
  { "A", 3 }
  ..,
  { "A", 10 },
  { "B", 11 },
  { "B", 12 },
  { "B", 13 },
  ...
  { "B", 20 },
  { "C", 21 },
  ...
  { "J", 100 }
}

这应该是非常直接的,除非我遗漏了什么

var grouped = ListA.Select((value, index) => 
  new {
    ListAItem = value,
    ListBItems = ListB.Skip(index * 10).Take(10)
  })
  .ToList();
返回您可以循环使用的匿名类型

foreach (var group in grouped)
{
  Console.WriteLine("List A: {0}", group.Name);
  foreach (var listBItem in group.ListBItems)
  {
    Console.WriteLine("List B: {0}", listBItem.Name);
  {
}

因此,列表A将始终包含10个对象,而列表B将始终包含100个对象?我正在从文本文件中读取,A中的对象数可能会有所不同。@greg您的意思是列表A中每1个对象对应列表B中的10个对象吗?对于任何混淆,我深表歉意。对于列表A中的每1个对象,列表B中有10个对应的对象。列表A中的第一个对象对应于列表B中的前10个对象,依此类推……顺便说一句,我使用LinqPad给出了我的示例,因此您应该能够复制/粘贴此对象,并在C#程序模式下运行它。+1在您的mod检查中。。。我把它作为练习放在海报上,但基本上是一字不差的。谢谢你的帮助,效果很好。我的编程经验是有限的,我能够最好地理解你的例子。IEnumerable接口是我以前没有使用过的,但很快就会使用。我仍在寻找合并包含不同类型列表的方法。很酷,很高兴听到这个消息
IEnumerable
是泛化所有集合的接口,例如.net中的所有数组、列表、序列、哈希表和字典都是实现IEnumerable的,这意味着它们是某些项的序列/集合,可以枚举。
foreach (var group in grouped)
{
  Console.WriteLine("List A: {0}", group.Name);
  foreach (var listBItem in group.ListBItems)
  {
    Console.WriteLine("List B: {0}", listBItem.Name);
  {
}