【问题标题】:How to use a Distinct on a column using Linq如何使用 Linq 在列上使用 Distinct
【发布时间】:2009-10-12 20:37:32
【问题描述】:

这是我的代码:

var query = from row1 in table.AsEnumerable()
                         let time = row1.Field<DateTime>("time")
                         let uri = row1.Field<string>("cs-uri-stem")
                         let ip = row1.Field<string>("c-ip")
                         let questionid = row1.Field<int>("questionid")
                         where questionid == int.Parse(table.Rows[x]["questionid"].ToString())
                         select new
                         {
                             time,
                             uri,
                             ip,
                             questionid
                         };

ip 列应该是唯一的。我不能在 ip 字段中有重复的项目。是否可以在 linq 中做到这一点

【问题讨论】:

    标签: c# linq datatable linq-to-objects


    【解决方案1】:

    您可以通过按 IP 地址分组来实现您想要的,但是当您确实有重复时,您需要知道如何处理其他字段。

    var query = from row1 in table.AsEnumerable()
                         let time = row1.Field<DateTime>("time")
                         let uri = row1.Field<string>("cs-uri-stem")
                         let ip = row1.Field<string>("c-ip")
                         let questionid = row1.Field<int>("questionid")
                         where questionid == int.Parse(table.Rows[x]["questionid"].ToString())
                         group by ip into g
                         select new
                         {
                             time = g.time.First(),
                             uri = g.uri.First(),
                             ip = g.Key,
                             questionid = g.questionid.First()
                         };
    

    【讨论】:

      【解决方案2】:

      您只能在您选择的所有字段上执行Distinct,而不仅仅是在一个字段上(您会为其他字段采用哪些值?)。

      您可以通过使用Distinct 扩展方法来实现:

              var query = (from row1 in table.AsEnumerable()
                           let time = row1.Field<DateTime>("time")
                           let uri = row1.Field<string>("cs-uri-stem")
                           let ip = row1.Field<string>("c-ip")
                           let questionid = row1.Field<int>("questionid")
                           where questionid == int.Parse(table.Rows[x]["questionid"].ToString())
                           select new
                           {
                               time,
                               uri,
                               ip,
                               questionid
                           }).Distinct();
      

      【讨论】:

        【解决方案3】:

        您还可以将Distinct() 与相等比较器一起使用(即,传入一个将比较IP 值的方法,而忽略其余部分)。但正如 tvanfosson 所问,处理重复值的正确程序是什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-05
          相关资源
          最近更新 更多