2014-02-09 3 views
1

Я не большой поклонник VB. Может ли кто-нибудь помочь мне сделать этот кусок кода в C#?Какова эквивалентность C# ключевого слова Aggregate в VB Linq?

Public ReadOnly Property HasErrors() As Boolean 
     Get 
      Return (Aggregate o In Me _ 
        Let errObj = TryCast(o, IDataErrorInfo) _ 
        Where If(errObj IsNot Nothing, errObj.Error <> Nothing, False) _ 
        Into Count()) > 0 
     End Get 
    End Property 

Update

Public MustInherit Class MyBaseCollection(Of T) 
    Inherits ObservableCollection(Of T) 

    Public ReadOnly Property HasErrors() As Boolean 
     Get 
      Return (Aggregate o In Me _ 
        Let errObj = TryCast(o, IDataErrorInfo) _ 
        Where If(errObj IsNot Nothing, errObj.Error <> Nothing, False) _ 
        Into Count()) > 0 
     End Get 
    End Property 

    Sub New(ByVal query As IEnumerable(Of T), ByVal context As OMSEntities) 
     MyBase.New(query) 
    End Sub 

End Class 
+0

Я попытался преобразовать его с помощью онлайн перекодировку , Но в итоге я получаю несвязанный код. – sovantha

ответ

0

Я не 100% на то, что это, но я думаю, что вы можете сделать с

this.Any(o => { 
    var errObj = o as IDataErrorInfo; 
    return errObj != null && errObj.Error != null 
}); 

или вы можете сделать более функциональный стиль:

this.Select(o => o as IDataErrorInfo) 
    .Any(errObj => errObj != null && errObj.Error != null); 
+0

В C# нет 'TryCast'. http://stackoverflow.com/questions/3350770/how-to-convert-trycast-in-c – MarcinJuraszek

+0

@MarcinJuraszek ах, я думал, что это его собственная функция, в этом случае мы можем использовать 'as' –

1

Там нет эквивалента для Aggregate в запросе синтаксической основе в C#. Вы должны использовать методы.

public bool HasErrors 
{ 
    get 
    { 
     return this.Select(x => x as IDataErrorInfo) 
        .Where(x => x != null && x.Error != null) 
        .Count() > 0; 
    } 
} 

Или проще вариант с Count(predicate) перегрузки:

public bool HasErrors 
{ 
    get 
    { 
     return this.Select(x => x as IDataErrorInfo) 
        .Count(x => x != null && x.Error != null) > 0; 
    } 
} 

или даже лучше с Any(predicate):

public bool HasErrors 
{ 
    get 
    { 
     return this.Select(x => x as IDataErrorInfo) 
        .Any(x => x != null && x.Error != null); 
    } 
} 
0

Это не точный перевод, но он будет получать тот же результат:

public bool HasErrors 
{ 
    get 
    { 
     return this.OfType<IDataErrorInfo>().Any(x => x.Error != null); 
    } 
} 
Смежные вопросы