无法在一个var中组合两个linq结果

时间:2014-12-01 19:02:54

标签: c# linq silverlight

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

 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>'

有什么建议吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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电话会正常运作。

答案 2 :(得分: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视为不同,因此不能在Union语句中使用