C#:比较列表中的字符串<;字符串>;在单独列表中的对象中使用字符串属性<;对象>;使用Obj.getName()
我正在写一个程序,其中我有一副卡片(MyDeck对象),其中包含一个列表(类型卡片列表),其中是我的卡片(卡片对象)。 还有一本杂志(杂志对象),上面有一张卡片列表(类型字符串列表)可供出售。我想将杂志中的卡片添加到我的牌组中 除非我还没有卡。困难的是我的卡是对象,而杂志中的卡是字符串,所以我必须调用mycard.getCardName() 为了得到我的卡片的名字和杂志上的卡片,我可以简单地列出列表,因为它们只是一个字符串列表 这是我的代码,问题是只有杂志中的前两张卡被添加到我的牌组中 也许我处理这个问题的方法不对C#:比较列表中的字符串<;字符串>;在单独列表中的对象中使用字符串属性<;对象>;使用Obj.getName(),c#,algorithm,list,foreach,compare,C#,Algorithm,List,Foreach,Compare,我正在写一个程序,其中我有一副卡片(MyDeck对象),其中包含一个列表(类型卡片列表),其中是我的卡片(卡片对象)。 还有一本杂志(杂志对象),上面有一张卡片列表(类型字符串列表)可供出售。我想将杂志中的卡片添加到我的牌组中 除非我还没有卡。困难的是我的卡是对象,而杂志中的卡是字符串,所以我必须调用mycard.getCardName() 为了得到我的卡片的名字和杂志上的卡片,我可以简单地列出列表,因为它们只是一个字符串列表 这是我的代码,问题是只有杂志中的前两张卡被添加到我的牌组中 也许我处
public static class MyDeck
{
public static List<Card> Cards = new List<Card>();
//Other Members
}
public class Card
{
//associated memebers
}
public class Magazine
{
public List<string> MagCards = new List<string>();
//Other Members
}
private void AddCardsToMyDeck(List<string> MagCards)
{
//If I have no cards in my deck then add the first one on the magazine to my deck
if(MyDeck.MyCards.Count == 0)
{
Card c = new Card(MagCards[0]);
MyDeck.MyCards.Add(c);
}
//for each name of each card in the magazine
foreach(string MagCard in MagCards)
{
//for each card in my deck
foreach (Card crd in MyDeck.MyCards)
{
//if the my card is in the magazine then don't add it, else add it
if (MagCards.Contains(crd.getCardName()))
{
break;
}
else
{
Card cd = new Card(MagCard);
MyDeck.MyCards.Add(cd);
}
}
}
}
// NOTE: MyDeck.Cards is empty
Magazine.MagCards.Add("B. Ruth");
Magazine.MagCards.Add("M. Piazza");
Magazine.MagCards.Add("J. Robinson");
AddCardsToMyDeck(Magazine.MagCards);
//Only Ruth and Piazza are added
公共静态类MyDeck
{
公共静态列表卡=新列表();
//其他成员
}
公务舱卡
{
//关联成员
}
公共类杂志
{
公共列表磁卡=新列表();
//其他成员
}
私人作废AddCardsToMyDeck(列出磁卡)
{
//如果我的牌组中没有牌,那么将杂志上的第一张牌添加到我的牌组中
if(MyDeck.MyCards.Count==0)
{
卡c=新卡(磁卡[0]);
MyDeck.MyCards.Add(c);
}
//杂志上每张卡片的每个名字
foreach(磁卡中的字符串磁卡)
{
//我牌组中的每一张牌
foreach(MyDeck.MyCards中的卡片crd)
{
//如果我的卡片在杂志上,那么不要添加它,否则添加它
if(MagCards.Contains(crd.getCardName()))
{
打破
}
其他的
{
卡cd=新卡(磁卡);
MyDeck.MyCards.Add(cd);
}
}
}
}
//注意:MyDeck。卡片是空的
杂志。磁卡。添加(“B.Ruth”);
杂志。磁卡。添加(“M.Piazza”);
杂志。磁卡。添加(“J.罗宾逊”);
AddCardsToMyDeck(杂志、磁卡);
//只加了露丝和皮亚扎
我想你是在倒退。问题的文本表示,如果卡尚未在牌组中,则希望将杂志中的卡添加到牌组中,但代码会查看牌组中的卡,如果它们不在杂志中,则尝试执行某些操作。无论哪种方式,您都要通过编写for循环来完成这项工作:
private void AddCardsToMyDeck(List<string> MagCards)
{
var newCards = MagCards.Except(MyDeck.MyCards.Select(c => c.getCardName()));
MyDeck.MyCards.AddRange(newCards.Select(c => new Card(c)).ToArray());
}
private void AddCardsToMyDeck(列出磁卡)
{
var newCards=MagCards.Except(MyDeck.MyCards.Select(c=>c.getCardName());
MyDeck.MyCards.AddRange(newCards.Select(c=>newcard(c)).ToArray();
}
我不确定我是否理解您的问题,但要解决您提出的问题,您可以使用linq先将列表转换为名称列表
foreach (string crd in from c in MyDeck.MyCards select c.getCardName() )
{
if ( MagCards.Contains( crd ) )
{
break;
}
else
{
Card cd = new Card(MagCard);
MyDeck.MyCards.Add(cd);
}
}
Joel Coehoorn将此作为一个设计问题给出了一个很好的答案
// get card names in your deck
var deckCardNames = MyDeck.Cards.Select( c => c.getCardName() );
// get card names in magazine cards that are not in your deck
var missingMagCardNames = MagCards.Except( deckCardNames );
// instantiate card objects for each missing card name
var missingCards = missingMagCardNames.Select(mc => new Card(mc));
// add missing cards to your deck
MyDeck.Cards.AddRange( missingCards );
// whole thing inline
MyDeck.Cards.AddRange( MagCards.Except( MyDeck.Cards.Select( c => c.getCardName() ) ).Select (mc => new Card(mc) ) );