在C#列表中重复计数特定值的次数

时间:2014-08-12 19:56:40

标签: c# excel list oledb

我有一个包含7列的列表,其中包含使用Oledb从Excel工作表导入的多行数据。现在我想通过列表并从第1列开始检查第一列第一行中的值并找出它在列表中出现的次数,如果它出现多次,我想存储所有其他列值与其他列表中的第一列一起进行某些操作

例如,我在列表中有以下数据行

Time        CC   Month  prc      str    tx      qq
14:46:00    NP  14-Dec                 4.0000   6,000
14:46:00    LN  14-Dec  6.00    Put     2.0090  1,500
14:46:00    LN  14-Dec  6.00    Call    0.0095  1,500
14:42:57    LN  14-Sep  3.85    Put     0.0860  50
14:42:57    LN  14-Sep  3.85    Call    0.1200  50
14:34:00    LN  14-Sep  3.25    Put     0.0025  200
14:34:00    LN  14-Sep  3.50    Put     0.0100  100
14:32:00    NP  14-Dec                  4.0000  2,000
14:32:00    LN  14-Dec  6.00    Put     2.0090  500
14:32:00    LN  14-Dec  6.00    Call    0.0095  500
14:27:00    LN  15-Mar  4.50    Call    0.2230  100
14:26:00    LN  15-Mar  4.50    Call    0.2210  200

在列表中的上述数据行中,我的第一列为time,而time列的第一行为14:46:00,现在要检查次数{{1重复并插入与14:46:00关联的所有行和列,并对它们执行一些算术运算,然后移到下一个唯一的14:46:00时间值并重复该过程

14:42:57的示例List1如下

Time 14:46:00

一旦在上面的列表上完成某些操作,它就可以被14:46:00 NP 14-Dec 4.0000 6,000 14:46:00 LN 14-Dec 6.00 Put 2.0090 1,500 14:46:00 LN 14-Dec 6.00 Call 0.0095 1,500 的下一组值覆盖

我已使用以下代码行将Excel表格中的数据导入列表

time 14:42:57

3 个答案:

答案 0 :(得分:1)

public class AxiomDS
{
    public DateTime time { get; set; }
    public string CC { get; set; }
    public string term { get; set; }
}

public class Program
{
    static void Main(string[] args)
    {
        List<AxiomDS> resultAxiomData = new List<AxiomDS>();

        var uniqueTimes = resultAxiomData.Select(a => a.time).Distinct();

        foreach (var uniqueTime in uniqueTimes)
        {
            // Find all records that have this time
            var recordsToProcess = resultAxiomData.Where(r => r.time == uniqueTime);

            // TODO:
            foreach (var record in recordsToProcess)
            {
                // Do something with this list
            }
        }
    }
}

答案 1 :(得分:1)

听起来您希望按time对条目进行分组,然后对每个包含多条记录的组执行一些操作。 LINQ让这很容易:

var groupedData = from result in resultAxiomData
                  group result by result.time into resultGroup
                  where resultGroup.Count() > 1
                  order by resultGroup.Key
                  select resultGroup;

现在您可以遍历分组结果:

foreach (var timeGroup in groupedData)
{
    // timeGroup.Key is the time
    foreach (var entry in timeGroup)
    {
        // process the entry
    }
}

答案 2 :(得分:0)

使用LINQ到对象:

public class Row {
    DateTime Time {get; set;}
    string CC { get; set; }
    string Month {get; set;}
    double PRC {get; set;}
    string Str {get; set;}
    double TX {get; set;}
    int QQ { get; set; }
}

var allEntries = new List<Row>();

//Load data...

var allEntriesDict = allEntries.Select(entry => entry.Time)
                               .Distinct()
                               .ToDictionary(time => time, 
                                             time => allEntries.Where(entry => entry.Time == time).ToList());
foreach(var kvp in allEntriesDictionary) {
    //kvp.Key is the Time
    //kvp.Value is a List<Row>
    DoCalculations(kvp.Value);
}