如何比较和匹配两种通用类型 [英] how to compare and match two generic types

查看:345
本文介绍了如何比较和匹配两种通用类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,
我有两种通用类型(T值)(T节点).现在我怎么知道两者都以相同的整数,字符串或字符开头?

谢谢.

Hi Guys,
I have two generic types (T value) (T node). Now how do I know both starting with same integer or string or char???

Thanks

推荐答案

简短的答案,在不了解类型的情况下,您无法进行任何形式的排序或高级值检查,因为这毫无意义. (如果有人创建了YourTree< double>或YourTree< Socket>呢?那么寻找前几个字符将毫无意义.)

例外是适用于Object的事物,因此您可以:
-如Kim所说,使用Object.Equals或EqualityComparer通过值相等将它们分组在一起
-使用其哈希码,尽管通常这没有用
-使用其字符串表示形式(ToString()),这可能就是您想要的

听起来您想将T限制为对它们具有特定操作的类,即提供名称,并且可能具有可比性.这意味着您需要一个接口,例如
Short answer, without knowing anything about the type, you can''t do any form of sorting or advanced value checking, because it would make no sense. (What if someone made a YourTree<double>? Or a YourTree<Socket>? Then looking for the first few characters would be meaningless.)

The exceptions are things that work on Object, so you can:
- group them together by value equality using Object.Equals or EqualityComparer as Kim says
- use their hashcode, though this is generally not useful
- use their string representation (ToString()), which might be what you want

It sounds like you want to restrict your T to classes which have particular operations on them, namely, providing a name, and possibly be comparable. That means you need an interface, for example
public interface ITreeNode : IComparable<ITreeNode> {
 string Name { get; }
}



...然后您需要在主类上限制T以支持该接口:



... and then you need to restrict the T on your main class to support that interface:

public class MyBinaryTree<T> where T: ITreeNode {
...
}



现在,您无法创建MyBinaryTree< int> (int不是ITreeNode),因此您需要为要包含在树中的数据类型创建ITreeNode子类.您可以使用一个默认的



Now, you can''t create a MyBinaryTree<int> (int is not an ITreeNode), so you need to create ITreeNode subclasses for the data types you want to be in the tree. You can have a default one that looks like

public class TreeNode<T> : ITreeNode {
 T inner;

 public TreeNode(T inner) { this.inner = inner; }

 public int CompareTo(T other){
  if(inner is IComparable<T>) return ((IComparable<T>)inner).CompareTo(IComparable<T>)other);
  else return StringComparer.CurrentCulture.Compare(inner, other);
 }

 public string Name { get { return inner.Name; } }
}



...,它包装任何类型并使用其比较器(如果有的话),否则使用字符串表示形式. (我认为本机数字类型支持IComparable< T> ;,因此它们应该正确排序.)现在您可以做



... which wraps any type and uses its comparer if it has one, otherwise the string representation. (I think the native numeric types support IComparable<T> so they should sort correctly.) Now you can do

var myTree = new MyBinaryTree<TreeNode<int>>();


在MyBinaryTree中,您可以使用ITreeNode的方法(即名称),也可以将节点视为IComparable< T>. (即,将它们传递给排序例程).

希望可以为您提供足够的信息,以便您可以准确地确定如何将其应用于您的情况.

E:很自然,它是当场制作的,未经测试,甚至可能不会编译.此外,泛型类型和HTML不能很好地配合使用.


.. and within MyBinaryTree, you can use the methods of ITreeNode (i.e. the name), and also treat the nodes as IComparable<T> (i.e. pass them to sorting routines).

Hopefully that gives you enough information that you can work out exactly how to apply it to your situation.

E: Naturally, this was made up on the spot, not tested, and probably won''t even compile. Also, generic types and HTML don''t really play well together.


您可以使用
You can use Object.Equal[^] to call the compare ?

Or
EqualityComparer<T>.Default.Equals(x, y);


这篇关于如何比较和匹配两种通用类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆