【问题标题】:Duplicate values using linq使用 linq 重复值
【发布时间】:2013-06-26 05:54:03
【问题描述】:

我有以下方式的输入格式

S.no姓名工资

1       Tom     $200

1       Tom     $300

1       Tom     $400

2        Rob     $500

2        Rob     $600

结果集应该是这样的

  Name   OriginalWage  DuplicateWage

   Tom       $200              $300

   Tom      $200               $400

   Rob       $500               $600

我应该留下第一条记录,把重复的记录算进去。这里原来的工资是第一个不同记录的工资。

如何使用 linq 完成结果集。

This is the one i tried so far


//Get duplicate values
Dim Duplicates = wageRecordList.GroupBy(Function(w) w.serialnumber).Where(Function(d) d.Count > 1)

//load duplicates to a list 
lstDuplicateRecords=Duplicates 

//Read list--This one is a hard coded sort of thing and works only for one set of duplicate values

lstResult = (From duplicateRecords In lstDuplicateRecords.Skip(1) Select serialnumber= duplicateRecords.serialnumber, Name= duplicateRecords.Name, OriginalWages= CType(lstDuplicateRecords(0).Wages, String), _
DuplicateWages = CType(duplicateRecords.wages, String))

【问题讨论】:

  • 嗯,到目前为止你尝试了什么?这是 LINQ to Objects、LINQ to SQL 还是别的什么?你有一个排序列可以用来确定“第一个”值吗?
  • 副本在哪里,你尝试过什么?听起来你需要组
  • @JonSkeet 这是我迄今为止尝试过的 //获取重复值 Dim Duplicates = warnRecordList.GroupBy(Function(w) w.serialnumber).Where(Function(d) d.Count > 1 ) //将重复项加载到列表中 lstDuplicateRecords=Duplicates //读取列表--这是一种硬编码的东西,仅适用于一组重复值 lstResult = (From duplicateRecords In lstDuplicateRecords.Skip(1) Select serialnumber= duplicateRecords.serialnumber, Name= duplicateRecords.Name, OriginalWages= CType(lstDuplicateRecords(0).Wages, String), _ DuplicateWages = CType(duplicateRecords.wages, String))

标签: c# vb.net linq lambda


【解决方案1】:

你可以做这样的事情

 var groupedUsers = from user in users
                           group user by user.User into userGroup
                           select new
                           {
                               User = userGroup.Key,
                               userHobies =
                                   userGroup.Aggregate((a, b) => 
                                       new { User = a.User, Hobby = (a.Hobby + ", " + b.Hobby) }).Hobby
                           }
                            ;
        foreach (var x in groupedUsers)
        {
            Debug.WriteLine(String.Format("{0} {1}", x.User, x.userHobies));
        }

代码不是我的,取自:Use LINQ to concatenate multiple rows into single row (CSV property)

这个link 也可能有帮助

已编辑

对不起,误解了你的问题 像这样的东西可以解决问题

var query = from sal in _yourcontext
join salmin in ( from sal1 in _yourcontext
                 group sal1 by sal1.name into group
                 select new{ 
                        Name = group.Key
                        MinSal = group.Min(sal1=>sal1.Salary))
                        }
on sal.Name equals salmin.Name into result
where sal.Salary != salmin.MinSal
select new{ salmin.Name,salmin.MinSal,sal.Salary }

【讨论】:

    【解决方案2】:

    我设法得到了您想要的结果集(证明是一个不错的挑战):

    假设它为员工找到的第一条记录是原始工资,但是......

    var result = from employeeWages in GetEmployees().GroupBy(e => e.Name)
                 from duplicateWage in employeeWages.Skip(1).Select(e => e.Wage)
                 select new
                 {
                    Name = employeeWages.Key,
                    OriginalWage = employeeWages.First().Wage,
                    DuplicateWage = duplicateWage
                 };
    

    这里有一个完整的 LinqPad 脚本用于测试:http://share.linqpad.net/wgxcns.linq

    示例结果

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多