Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对列表进行排序<;T>;基于T';s列表<;字符串>;财产_C#_List - Fatal编程技术网

C# 对列表进行排序<;T>;基于T';s列表<;字符串>;财产

C# 对列表进行排序<;T>;基于T';s列表<;字符串>;财产,c#,list,C#,List,我有一个自定义对象Deck,它的属性之间有一个列表卡片。每个卡都有自己的列表颜色表示卡的颜色,使用一个或多个大写字母,如[W,U,B,R,G] 我需要做的是根据颜色列表对卡片列表进行排序,首先从一种颜色中获取所有卡片,依此类推;对于具有多种颜色的卡,我希望根据自定义优先级列表对它们进行排序(例如,如果它是W和U将其放在W卡之间),但我意识到这更为复杂,因此我并不需要这样做 我想做的是 deck.cards = deck.cards.OrderBy(x => x.colors).ToList

我有一个自定义对象
Deck
,它的属性之间有一个
列表卡片
。每个
都有自己的
列表颜色
表示卡的颜色,使用一个或多个大写字母,如
[W,U,B,R,G]

我需要做的是根据
颜色
列表对
卡片
列表进行排序,首先从一种颜色中获取所有卡片,依此类推;对于具有多种颜色的卡,我希望根据自定义优先级列表对它们进行排序(例如,如果它是
W
U
将其放在
W
卡之间),但我意识到这更为复杂,因此我并不需要这样做

我想做的是

deck.cards = deck.cards.OrderBy(x => x.colors).ToList();
但我收到一个错误,指出至少有一个对象需要实现ICompare


我能做些什么来整理我的甲板清单?是否可以不仅按所述顺序排序,还可以根据特定顺序排序,如
B
before
R
before
G
等等?

根据评论中的讨论,当一张卡片有多种颜色时,您需要选择一种颜色(在优先级列表中首先出现的颜色),并在此基础上进行排序

// Higher-priority colours come first
var coloursPriority = new List<string>() { "W", "U", "B", "R", "G" };

// Turn the card's colour into an index. If the card has multiple colours,
// pick the smallest of the corresponding indexes.
cards.OrderBy(card => card.Colours.Select(colour => coloursPriority.IndexOf(colour)).Min());

根据评论中的讨论,当一张卡片有多种颜色时,您需要选择一种颜色(在优先级列表中最先出现的颜色),并在此基础上进行排序

// Higher-priority colours come first
var coloursPriority = new List<string>() { "W", "U", "B", "R", "G" };

// Turn the card's colour into an index. If the card has multiple colours,
// pick the smallest of the corresponding indexes.
cards.OrderBy(card => card.Colours.Select(colour => coloursPriority.IndexOf(colour)).Min());

通过使用聚合函数,您可以获得订购卡的列表,如下所示:

var result = deck.Cards
    .OrderBy(x => x.Colours.Aggregate((total, part) => total + part.ToLower()))
    .ToList();
这假设具有多种颜色的卡具有有序列表中的颜色

e、 g

card1.colors=newlist(){“W”,“X”};
card2.colors=newlist(){“W”};
card3.colors=newlist(){“U”};
card4.colors=新列表(){“U”,“W”};
将按以下顺序返回卡:


“U”、“UW”、“W”、“WX”

您可以使用聚合函数获得订购卡的列表,如下所示:

var result = deck.Cards
    .OrderBy(x => x.Colours.Aggregate((total, part) => total + part.ToLower()))
    .ToList();
这假设具有多种颜色的卡具有有序列表中的颜色

e、 g

card1.colors=newlist(){“W”,“X”};
card2.colors=newlist(){“W”};
card3.colors=newlist(){“U”};
card4.colors=新列表(){“U”,“W”};
将按以下顺序返回卡:


“U”、“UW”、“W”、“WX”

我不懂这句话:“(就像是W和U放在W卡之间)。”一些输入和输出示例可能会有所帮助。@canton7每张卡可以是一种或多种颜色,颜色用大写字母表示。在对多色卡片进行排序时,如果可能的话,我希望根据自定义的“优先级”顺序将它们插入到特定颜色的卡片之间,因此如果一张卡片同时是W和U,我希望它在W卡片之间进行排序。我意识到这会使整个事情变得更加复杂,所以这并不是必须的,更像是一个怪癖。你可以创建一个
实现
IComparer
,并使用
List.Sort
方法。我认为你需要更好地指定多色行为。你有“如果它是W,而你把它放在W和U之间”,但是如果你有第三种颜色,比如你有“B”,“BU”和“BW”,那该怎么办呢。我假设B先去BW,但是BU去哪里?还是简单地说,你先按单色字母顺序排序,然后在多色卡片的末尾按第二种(或第三种,等等)颜色排序?我发现,一旦您清楚明确地解释了您希望排序如何工作,代码就会很容易地从中派生出来……尽管如此,我认为这可能已经足够复杂,您可能需要创建一个自定义比较器(即
IComparer
)。有一些与此相关的问题可能会给你一个好的开始(例如)。我不懂这句话:“(比如,如果是W和U,把它放在W卡之间)。”一些输入和输出示例可能会有所帮助。@canton7每张卡可以是一种或多种颜色,颜色用大写字母表示。在对多色卡片进行排序时,如果可能的话,我希望根据自定义的“优先级”顺序将它们插入到特定颜色的卡片之间,因此如果一张卡片同时是W和U,我希望它在W卡片之间进行排序。我意识到这会使整个事情变得更加复杂,所以这并不是必须的,更像是一个怪癖。你可以创建一个
实现
IComparer
,并使用
List.Sort
方法。我认为你需要更好地指定多色行为。你有“如果它是W,而你把它放在W和U之间”,但是如果你有第三种颜色,比如你有“B”,“BU”和“BW”,那该怎么办呢。我假设B先去BW,但是BU去哪里?还是简单地说,你先按单色字母顺序排序,然后在多色卡片的末尾按第二种(或第三种,等等)颜色排序?我发现,一旦您清楚明确地解释了您希望排序如何工作,代码就会很容易地从中派生出来……尽管如此,我认为这可能已经足够复杂,您可能需要创建一个自定义比较器(即
IComparer
)。与此相关的一些问题可能会给您一个良好的开端(例如)。我得到一个“方法IndexOf takes 1 arguments无重载”错误。@nicktheone fixedYes它有:。显然,对于您的用例,您需要执行
deck.cards=deck.cards.OrderBy(…).ToList()
,就像您在问题中所做的那样。@canton7:问题是“如果卡片有多种颜色,我希望它们根据自定义优先级列表进行排序(例如如果是W,则将其放在W卡片之间)”,我将其解释为输入错误“在W和U卡之间”。我将把它留给OP来评论他们是否关心这个问题。我认为你的最新答案现在是完美的!它还考虑了没有颜色的可能性,这很好!我得到了一个“m没有过载”的答案
var result = deck.Cards
    .OrderBy(x => x.Colours.Aggregate((total, part) => total + part.ToLower()))
    .ToList();
    card1.Colours = new List<string>() { "W", "X" };
    card2.Colours = new List<string>() { "W" };
    card3.Colours = new List<string>() { "U" };
    card4.Colours = new List<string>() { "U", "W" };