【问题标题】:better linq union更好的 linq 联盟
【发布时间】:2013-03-19 01:29:33
【问题描述】:

我有一个这样的数据表(示例):

当前文本 当前值 旧文本 旧值 ------------------------------------------ 测试 1 1 旧测试 1 1 测试2 2 旧测试2 2

我想做一个联合所以结果看起来像这样

文本值 IsCurrent 测试1 1 真 测试2 2 真 OldTest1 1 错误 OldTest2 2 错误

我现在怎么做:

 var lst = dt.AsEnumerable().Select(x => new MyClass
            {
                 Text = x.Field<string>("CurrentText"), 
                 Value = x.Field<string>("CurrentValue"),  
                 IsCurrent=true
            })
             .Union(dt.AsEnumerable().Select(x => new MyClass
             {
                 Text = x.Field<string>("OldText"), 
                 Value = x.Field<string>("OldValue"),  
                 IsCurrent=false
             })
             ).Distinct().ToList();    

我唯一的问题是:有更好/更快的方法吗?

【问题讨论】:

  • 在我看来,您从 dt 开始并将其投影到 IsCurrent 的两个变体中,然后将它们合并。我不清楚您要完成什么,因为这两个序列是相同的,除了一组将具有 true 而另一组将具有 false 用于 IsCurrent。那是你真正想要做的吗?
  • @KirkWoll,不,序列会有所不同,因为我正在尝试合并不同的列。所以,基本上我想将两列附加到另外两列。
  • 这很好,但是您应该真正修改您的代码以说明这种区别。现在我可以提供一个更清晰的答案,但我怀疑它会有所帮助。我真的需要看看你实际上是如何创建不同的序列的。
  • @KirkWoll,我想我不关注你。区别在于我的第一个数据集选择:x.Field&lt;string&gt;("CurrentText")x.Field&lt;string&gt;("CurrentValue"),而第二个数据集选择:x.Field&lt;string&gt;("OldText")x.Field&lt;string&gt;("OldValue")
  • 抱歉,你说得对。我在第一次扫描时错过了。

标签: c# asp.net linq c#-4.0


【解决方案1】:

不太清楚你需要完成什么,但为了代码的可读性,也许创建一个具体的 IEnuerable 类会帮助人们理解和扩展?

   private static IEnumerable<Tuple<String,String>> GetPairs(ref DataTable dtr)
    {
      var CurrentPairs = dtr.AsEnumerable().Select(t => Tuple.Create
                                                  (
                                                    t.Field<String>("CurrentText"),
                                                    t.Field<String>("CurrentValue")
                                                  ));
      var NewPairs = dtr.AsEnumerable().Select(t => Tuple.Create
                                                  (
                                                    t.Field<String>("OldText"),
                                                    t.Field<String>("OldValue")
                                                  ));

      return CurrentPairs.Union(NewPairs);
    }

【讨论】:

  • 你为什么要投影到元组中? OP 对匿名类型的原始投影将按预期工作。 (同一程序集中的两个匿名类型具有相同的属性,以相同的类型和相同的顺序声明将是相同的实际System.Type
  • 我使用元组是因为它既快速又简单,而且你不需要编写类来把东西放在一起,也不需要处理不是具体实现的数据表。在我看来,OP 想要不同类型的 Pair 值,因此我认为可读性很重要。匿名很快,但有时很讨厌。
  • 没关系,我知道您使用它的原因是允许从方法中返回它。道歉。
猜你喜欢
  • 2013-03-01
  • 2021-12-28
  • 2011-03-19
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多