2014-12-01 56 views
1

我有两个linq结果,我想将它们合并到一个var中。我怎样才能做到这一点?无法在一个var中合并两个linq结果

var xAxisconceptIdsAndName = _analysisResult.Select(x => new { x.ConceptId1, x.ConceptDisplay1 }).Distinct(); 
var yAxisconceptIdsAndName = _analysisResult.Select(x => new { x.ConceptId2, x.ConceptDisplay2 }).Distinct(); 

xAxisconceptIdsAndName返回(1, “A”)和yAxisconceptIdsAndName返回(2, “B”)。我希望他们在像一个结果(1, “A”),(2, “B”)等

结果:

途径 - 1:

var conceptIdsAndName = Enumerable.Union(xAxisconceptIdsAndName, yAxisconceptIdsAndName); 

错误:

The type arguments for method 'System.Linq.Enumerable.Union<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 

方法 - 2:

var conceptIdsAndName = xAxisconceptIdsAndName.Union(yAxisconceptIdsAndName); 

错误:

'System.Collections.Generic.IEnumerable<AnonymousType#1>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.Queryable.Union<TSource>(System.Linq.IQueryable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments 

Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Linq.IQueryable<AnonymousType#2>' 

有什么建议吗?

+0

'_analysisResult'的类型是什么? – MarcinJuraszek 2014-12-01 19:05:39

+0

它是一个ObservableCollection。 – CSharper 2014-12-01 19:06:31

+0

我想你正在寻找'Concat'方法。 'var conceptIdsAndName = xAxisconceptIdsAndName.Concat(yAxisconceptIdsAndName);' – MarcinJuraszek 2014-12-01 19:10:22

回答

2

您的匿名类型具有不同的性质使用,因此是不同的类型。如果使属性在名称,类型和顺序上相同,则将使用相同的类型,从而允许将它们组合为该匿名类型的单个序列。

var xAxisconceptIdsAndName = _analysisResult.Select(x => new 
    { 
     ConceptId = x.ConceptId1, 
     ConceptDisplay = x.ConceptDisplay1 
    }).Distinct(); 
var yAxisconceptIdsAndName = _analysisResult.Select(x => new 
    { 
     ConceptId = x.ConceptId2, 
     ConceptDisplay = x.ConceptDisplay2 
    }).Distinct(); 
var combined = xAxisconceptIdsAndName.Concat(yAxisconceptIdsAndName); 
+0

太棒了!谢谢。 – CSharper 2014-12-01 19:20:46

1

您需要在select语句中使用非匿名类型,这会导致类型在您的Union调用中匹配。

创建一个类型来保存结果,并将其用于X和Y轴数据。

例如,给定:

class AxisData : IEquatable<AxisData> 
{ 
    public int Id { get; set; } 
    public string Display { get; set; } // Should be the type of ConceptDisplay1 & 2 

    // Implement IEquatable<AxisData> 
} 

你可以写:

var xAxisconceptIdsAndName = _analysisResult.Select(x => new AxisData { Id = x.ConceptId1, Display = x.ConceptDisplay1 }).Distinct(); 
var yAxisconceptIdsAndName = _analysisResult.Select(x => new AxisData { Id = x.ConceptId2, Display = x.ConceptDisplay2 }).Distinct(); 

然后你Union通话将正常工作。

+0

使用比对象初始值设定项时,您需要指定属性名称。 – Servy 2014-12-01 19:22:02

+0

@Servy固定;) – 2014-12-01 19:23:54

1

你可以使用Tuple代替anonymous types

var xAxisconceptIdsAndName = _analysisResult.Select(x => 
    new Tuple<int,string> (x.ConceptId1, x.ConceptDisplay1)).Distinct(); 
var yAxisconceptIdsAndName = _analysisResult.Select(x => 
    new Tuple<int,string> (x.ConceptId2, x.ConceptDisplay2)).Distinct(); 

var union = xAxisconceptIdsAndName.Union(yAxisconceptIdsAndName); 

anonymous types由编译器considdered不同,因此不能在Union声明

+0

真棒..谢谢 – CSharper 2014-12-01 19:17:06