每个groupby列表(或数组)的run方法

时间:2012-08-13 23:17:19

标签: c# linq

我有一个文件夹,其中包含特定“政策”的图片。每个政策可能包含任意数量的图片。该文件夹还可以包含任意数量的策略。

VAH007157100-pic1.jpg
VAH007157100-pic2.jpg
VAH007157100-pic3.jpg

WAZ009999200-pic1.jpg
WAZ009999200-pic2.jpg
WAZ009999200-pic3.jpg
WAZ009999200-pic4.jpg
...

Foreach策略GROUP,我想运行一个方法(CreateTiffFile()),它接收一个ARRAY(该组中的文件)并执行某些操作。

在上面的示例中,该方法将运行两次(因为有2个不同的策略)。我也有2个不同的数组。一个阵列包含VAH007157100图片(本例中为3个)和另一个包含4张图片的阵列(WAZ009999200)。

我如何在每个组数组上运行此方法?

如果我不够清楚,请告诉我。请记住,每个政策的政策数量和图片数量各不相同,因此我需要考虑到这一点。

为了获得更好的愿景(基于上述数据):

CreateTiffFile(array containing VAH007157100 pics);
CreateTiffFile(array containing WAZ009999200 pics);

...

等等。

4 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

IEnumerable<string[]> grouped = theFiles.GroupBy(filename => filename.Split('-')[0])).Select(g => g.ToArray());

foreach(var group in grouped)
    CreateTiffFile(group);

答案 1 :(得分:1)

假设您有一个名为files的字符串列表(无论是数组还是其他集合):

var groups = files.GroupBy(s => s.Substring(0, s.IndexOf('-')));
foreach (var group in groups)
{
    CreateTiffFile(group.ToArray()); // ToArray() returns a string[] with the file names
}

答案 2 :(得分:0)

解决方案接近于此:

// get the filenames somehow
string[] filenames = ...;

// split the filenames
char[] breaker = new char[]{ '-' };
var policies_and_numbers = filenames.Select(fname => fname.Split(breaker));
// item is an string[]: [0] is policy, [1] is filename

// group them by the policy
var grouped = policies_and_numbers.GroupBy(thearr => thearr[0]);

// ensure the grouped items are kept as arrays
var almostdone = grouped.Select(group => new KeyValuePair<string, string[]>(group.Key, group.ToArray());
// now, the item is KVP, key is the Policy, and the Value is the array of pics

foreach(var pair in almostdone)
    CreateTiffFile(pair.Key, pair.Value); // first arg = policyname, second = the array of "pic1.jpg", "pic2.jpg"...

编辑:为了清晰的操作,代码已经膨胀。您可以轻松地将其压缩成单线,就像其他海报所示:)

答案 3 :(得分:0)

string CalcGroup(string filename) { ... }
string CreateTiffFile(IEnumerable<string> filesInGroup) { ... }
//...
files.GroupBy(CalcGroup).ToList().ForEach(CreateTiffFile);