繁体   English   中英

嵌套结构成员的列表排序

[英]List sorting on nested struct members

使用IComparer的实现来整理列表时,我遇到了一些问题。

public struct VAL
{
    public int i;
    public string s;
}

public struct INFO
{
    public string name;
    public VAL val;
    public string address;
}

public class ListSorter:IComparer<INFO>
{
    public enum SORT_TYPE{BYNAME, BYVAL,BYADDRESS};
    public int Compare(INFO i1, INFO i2)
        {
        switch(sortType)
        {
            case SORT_TYPE.BYNAME;
                return string.Compare(i1.name, i2.name);
            case SORT_TYPE.BYADDRESS:
                return string.Compare(i1.address, i2.address); 
            case SORT_TYPE.BYVAL:
            {
                ??????
            }
        }
    }   
}

ListSorter类中的比较函数是如何比较给定INFO结构中的字符串的示例。 但是我不知道如何根据VAL结构信息成员对列表进行排序

通常,您会执行以下操作:

case SORT_TYPE.BYVAL:
{
    int ret = i1.VAL.i.CompareTo(i2.VAL.i);
    if (ret != 0)
    {
        return ret;
    }
    return i1.VAL.s.CompareTo(i2.VAL.s);
}

首先比较i ,如果相等,则比较s (或者相反,必须由您选择顺序)。

不知道VAL应该代表什么,在这里我们几乎不可能为您的问题提供确定的答案。 天真的实现会选择一个字段优先于另一个字段-正如xanatos在他的回答中所示(他发布的代码实现了我进一步介绍的逻辑)。

IE哪个子比较最重要,是i还是s 在不知道这里的情况下,我们可以涵盖比较中的所有组合(除2个组合之外)-以及另外2个“连续”组合。

以下几乎表格可以帮助您确定两个VALVAL1VAL2

VAL1.i == VAL2.i
(and) VAL1.s == VAL2.s => 0
(or)  VAL1.s < VAL2.s => -1
(or)  VAL1.s > VAL2.s => 1
VAL1.i < VAL2.i
(and) VAL1.s == VAL2.s => -1 //(or possibly 0 if i is not important)
(or) VAL1.s < VAL2.s => -1
(or) VAL1.s > VAL2.s => ??? /** WHICH ONE MAKES SENSE TO YOU? **/
VAL1.i > VAL2.i
(and) VAL1.s == VAL2.s => 1 //(or possibly 0 if i is not important)
(or) VAL1.s < VAL2.s => ??? /** WHICH ONE MAKES SENSE TO YOU? **/
(or) VAL1.s > VAL2.s => 1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM