结合类似的LINQ查询

时间:2012-10-23 00:41:22

标签: c# linq linq-to-objects

我有一个格式为

的csv文件

LeftChoice,RightChoice,Left ||对了

其中LeftChoice和RightChoice是非唯一文本字符串,而Left ||右边是被挑选的字符串。

我想要做的是获取包含每个元素的List: 字符串,选择计数,非选择计数。

目前我有以下内容:

 var result = from line in file
                     let values = line.Split(',')
                     select new { Choice1 = values[0], Choice2 = values[1],  Result =  values[2].Equals("left")};


        var leftTrue = from dataSet in result
                 where dataSet.Result
                 group dataSet.Choice1 by dataSet.Choice1 into C1
                 select new { Value = C1.Key, Count = C1.Count() };


        var leftFalse = from dataSet in result
                       where !dataSet.Result
                       group dataSet.Choice1 by dataSet.Choice1 into C1
                       select new { Value = C1.Key, Count = C1.Count() };

        var rightTrue = from dataSet in result
                       where !dataSet.Result
                       group dataSet.Choice2 by dataSet.Choice2 into C2
                       select new { Value = C2.Key, Count = C2.Count() };


        var rightFalse = from dataSet in result
                        where dataSet.Result
                        group dataSet.Choice2 by dataSet.Choice2 into C2
                        select new { Value = C2.Key, Count = C2.Count() };

示例输入

 Fred,Cole,left
 Jill,Dave,right
 Pat,Fred,right
 Pat,Pat,left

示例输出: 会给予

Name Chosen NotChosen
Fred   2        0
Cole   0        1
Jill   0        1
Dave   1        0
Pat    1        2

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是按名称分组,然后计算选择名称而不是选择名称的次数。

var result = from line in file
             let values = line.Split(',')
             let left = values[0]
             let right = values[1]
             let leftChosen = values[2].Equals("left")
             let pair = new [] 
                        { 
                            new { Name = left, IsChosen = leftChosen }, 
                            new { Name = right, IsChosen = !leftChosen } 
                        }
             from item in pair
             group item by item.Name into nameGroup
             select new 
                    {
                        Name = nameGroup.Key, 
                        ChosenCount = nameGroup.Count(x => x.IsChosen),
                        NonChosenCount = nameGroup.Count(x => !x.IsChosen)
                    };