【问题标题】:Iterate a List<string> 12 by 12 and get the items迭代 List<string> 12 乘 12 并获取项目
【发布时间】:2021-11-24 22:56:50
【问题描述】:

我有一个通用的字符串列表,但我知道有 12 到 12 个项目我有一个记录。我还有一个想要填充的模型。

我的主密码

for (int r = 2; r <= rows; r++)
{
    for (int c = 3; c <= cols; c++)
    {
        try
        {
            list.Add(usedRange.Cells[r, c].Value2.ToString());
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}

foreach (string item in list)
{

}

所以在 foreach 中(列表中的字符串项)我知道 12 到 24 然后 36 我的记录在那里

问题在于代码的这种和平

foreach (string item in list)
{
  p.LastName = item
}

我需要一个for 才能用所有 12 个项目填充我的模型,我卡住了

【问题讨论】:

  • 澄清一下,您遇到的问题是,在 foreach 中,您正在对所有项目进行迭代,而您只需要项目 12、项目 24 和项目 36?

标签: c# list model vsto


【解决方案1】:

您还可以通过如下索引获取每 12 个元素中带有 for 的项目:

for (var i = 0; i < list.Count; i+=12)
    var p.LastName = list[i];

【讨论】:

  • 你好,问题是12+不递增,总是从0到12
【解决方案2】:

如果您希望将列表分成 12 个元素的块,您可以使用 C# 10 中新增的 Chunk Linq 扩展。如果您不使用 C# 10,库 MoreLinq 中提供了等效的扩展,它有一个不同的名称:Batch

// Creating a sample list of dummy elements
// There will be 100 strings from "0" to "99".
var MyList = Enumerable.Range(0, 100)
    .Select(i => $"{i}");

// Creating a list of chunks containing 12 elements
var ChunkedElements = MyList
    .Chunk(12);

// Using the chunked list.
foreach (var chunk in ChunkedElements)
{
    // Do what you want with the 12 elements
    Console.WriteLine("New Chunk");
    foreach(var e in chunk)
    {
        Console.WriteLine(e);
    }
}

输出:

New Chunk
0
1
2
3
4
5
6
7
8
9
10
11
New Chunk
12
13
14
15
16
17
18
19
20
21
22
23
New Chunk
24
25
26
27
28
29
30
31
32
33
34
35
New Chunk
36
37
38
39
40
41
42
43
44
45
46
47
New Chunk
48
49
50
51
52
53
54
55
56
57
58
59
New Chunk
60
61
62
63
64
65
66
67
68
69
70
71
New Chunk
72
73
74
75
76
77
78
79
80
81
82
83
New Chunk
84
85
86
87
88
89
90
91
92
93
94
95
New Chunk
96
97
98
99

如果您只想要每 12 个元素,这里是经典 for 循环的 Linq 替代方案。它没有好坏之分,但根据具体情况可能会有用。

// Creating a sample list of dummy elements
// There will be 100 strings from "0" to "99".
var MyList = Enumerable.Range(0, 100)
    .Select(i => $"{i}");

// Filtering the list to get only the 12th elements
var FilteredElements = MyList
    .Where((e, i) => i % 12 == 0);

// Using the filtered list
foreach (var e in FilteredElements)
{
    // Here do what you want with each element.
    Console.WriteLine(e);
}

输出:

0
12
24
36
48
60
72
84
96

解释:

.Where((e, i) =&gt; i % 12 == 0) 是工作完成的地方。 linq 扩展方法Where 有一个以 Func 为参数的重载。见the doc。第二个参数是集合元素的索引。

所以.Where((e, i) =&gt; i % 12 == 0) 只保留集合中索引i 可被12 整除的元素(i % 12 == 0)。因此结果只包含 12 的倍数。

【讨论】:

  • 嗨,我需要给模型添加位置,所以在每个foreach (var e in filteredElements) 中只传递一个值,我需要这个foreach (var e in filteredElements){p.LastName = e; p.FirstName = e;
  • 我编辑了我的答案,如果我正确理解您的需求,请告诉我。
【解决方案3】:

现在是这样,但我将其更改为更令人窒息的方法。

for (var i = 0; i < list.Count; i += 13)
{
    p.Add(new Participants()
    {
        LastName = list[0+i],
        FirstName = list[1 + i],
        AddressType = list[2 + i],
        Email = list[3 + i],
        Company = list[4 + i],
        Phone = list[5 + i],
        Street = list[6 + i],
        ZipCode = list[7 + i],
        City = list[8 + i],
        Country = list[9 + i],
        Percent = list[10 + i],
        Points = list[11 + i],
        Passed = list[12 + i],
    });
}

【讨论】:

  • 不错!要小心,因为这个for 可以throwIndexOutOfRangeException。您正在尝试访问list[12+i]。条件i &lt; list.Count 应更改为i &lt; list.Count - 12。所以你会避免这个异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2014-08-27
  • 2016-01-12
  • 2018-09-12
  • 2019-01-10
  • 1970-01-01
  • 2013-02-17
相关资源
最近更新 更多