【问题标题】:How do I returned a TYPED result?如何返回 TYPED 结果?
【发布时间】:2011-04-18 12:11:20
【问题描述】:

我想将Sorted 定义为ErrorProviderMessageCollection 类型,这就是unsortedCollection 的定义。

Dim Sorted As ErrorProviderMessageCollection = From item In unsortedCollection 
                                               Order By item.Control.TabIndex

我该怎么做?

Public Class ErrorProviderMessage Implements IComparable(Of ErrorProviderMessage)

    Private _Message As String
    Private _Control As Control

    Public Sub New(ByVal message As String, ByVal control As Control)
        _Message = message
        _Control = control
    End Sub

    Public ReadOnly Property Message() As String
        Get
            Return _Message
        End Get
    End Property

    Public ReadOnly Property Control() As Control
        Get
            Return _Control
        End Get
    End Property

    Public Function CompareTo(ByVal other As ErrorProviderMessage) As Integer Implements System.IComparable(Of ErrorProviderMessage).CompareTo
        Return Me.Control.TabIndex.CompareTo(other.Control.TabIndex)
    End Function

End Class

Public Class ErrorProviderMessageCollection

    Inherits System.Collections.ObjectModel.Collection(Of ErrorProviderMessage)

End Class

【问题讨论】:

    标签: .net vb.net linq


    【解决方案1】:

    您还可以使用 Lambda 和适当的扩展方法来处理强制转换,例如:

    var Sorted = unsortedCollection.OrderBy(i=>i.Control.TabIndex).ToSortedErrorProviderMessageCollection();
    

    以及扩展方法...

    public static class ErrorProviderMessageCollectionHelper
    {
        public static ErrorProviderMessageCollection ToSortedErrorProviderMessageCollection <T>(this IEnumerable<T> source) where T : ErrorProviderMessage 
        {
            var orderedCollection = new ErrorProviderMessageCollection();
            foreach (var item in source)
            {
                orderedCollection.Add(item);
            }
            return orderedCollection;
        }
    } 
    

    我不熟悉 VB.NET,所以请提供 C# 中的代码示例。

    【讨论】:

    • 我把它改成了这个,但它返回“Nothing”:Dim Sorted As ErrorProviderMessageCollection = TryCast(unsortedCollection.OrderBy(Function(i) i.Control.TabIndex), ErrorProviderMessageCollection)
    • 你能贴出ErrorProviderMessageCollection的代码吗?
    • 好的,你要么需要使用扩展方法/ienumerable helper(请参阅上一篇文章了解stackoverflow.com/questions/100851/…)或诉诸foreach语句,例如foreach (var p in unsortedCollection.OrderBy(i => i.Control.TabIndex)) { Sorted.Add(p); }
    • 如果没有更好的结果,我会尝试使用它,但我的第一个原因是我不应该自己重新创建集合。
    • 好吧,让我知道你过得怎么样。看来这里有很多其他人已经走上了扩展方法路径:stackoverflow.com/questions/1121938/…
    【解决方案2】:

    唯一的办法就是这样做:

    Dim Sorted As ErrorProviderMessageCollection = 
        New ErrorProviderMessageCollection(From item In unsortedCollection 
                                           Order By item.Control.TabIndex)
    

    为此,ErrorProviderMessageCollection 需要一个带有 IEnumerable(Of TypeOfItem) 类型参数的构造函数。

    【讨论】:

      【解决方案3】:

      正如批准的答案中所建议的那样,这很有效。此处显示的工作示例:

      Public Class Form1
      
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      
              Dim MyCollection As New ErrorProviderMessageCollection
      
      
              If txtLastName.Text.Trim = "" Then
                  MyCollection.Add(New ErrorProviderMessage("Last Name required", txtLastName, txtLastName.TabIndex))
              End If
      
              If txtFirstName.Text.Trim = "" Then
                  MyCollection.Add(New ErrorProviderMessage("First Name required", txtFirstName, txtFirstName.TabIndex))
              End If
      
              Dim Sorted As ErrorProviderMessageCollection = New ErrorProviderMessageCollection(From item In MyCollection Order By item.Control.TabIndex)
      
              For Each ErrorProviderMessage As ErrorProviderMessage In Sorted
                  MessageBox.Show(ErrorProviderMessage.Message & " " & ErrorProviderMessage.Control.TabIndex & " " & ErrorProviderMessage.Control.Name)
              Next
      
          End Sub
      
          Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      
          End Sub
      
      End Class
      
      
      Imports System.ComponentModel
      
      Public Class ErrorProviderMessage
      
          Private _Message As String
          Private _Control As Control
          Private _TabIndex As Integer
      
          Public Sub New(ByVal message As String, ByVal control As Control, ByVal tabIndex As Integer)
              _Message = message
              _Control = control
              _TabIndex = tabIndex
          End Sub
      
          Public ReadOnly Property Message() As String
              Get
                  Return _Message
              End Get
          End Property
      
          Public ReadOnly Property Control() As Control
              Get
                  Return _Control
              End Get
          End Property
      
          Public Property Tabindex() As Integer
              Get
                  Return _TabIndex
              End Get
              Set(ByVal value As Integer)
                  _TabIndex = value
              End Set
          End Property
      
      
      End Class
      
      
      Public Class ErrorProviderMessageCollection
      
          Inherits System.Collections.ObjectModel.Collection(Of ErrorProviderMessage)
      
          Public Sub New()
      
          End Sub
      
          Public Sub New(ByVal source As IEnumerable(Of ErrorProviderMessage))
      
              Dim orderedCollection = New ErrorProviderMessageCollection()
      
              For Each Item As ErrorProviderMessage In source
                  Me.Add(Item)
              Next
      
          End Sub
      
      End Class
      

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        相关资源
        最近更新 更多