Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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#:比较列表中的字符串<;字符串>;在单独列表中的对象中使用字符串属性<;对象>;使用Obj.getName()_C#_Algorithm_List_Foreach_Compare - Fatal编程技术网

C#:比较列表中的字符串<;字符串>;在单独列表中的对象中使用字符串属性<;对象>;使用Obj.getName()

C#:比较列表中的字符串<;字符串>;在单独列表中的对象中使用字符串属性<;对象>;使用Obj.getName(),c#,algorithm,list,foreach,compare,C#,Algorithm,List,Foreach,Compare,我正在写一个程序,其中我有一副卡片(MyDeck对象),其中包含一个列表(类型卡片列表),其中是我的卡片(卡片对象)。 还有一本杂志(杂志对象),上面有一张卡片列表(类型字符串列表)可供出售。我想将杂志中的卡片添加到我的牌组中 除非我还没有卡。困难的是我的卡是对象,而杂志中的卡是字符串,所以我必须调用mycard.getCardName() 为了得到我的卡片的名字和杂志上的卡片,我可以简单地列出列表,因为它们只是一个字符串列表 这是我的代码,问题是只有杂志中的前两张卡被添加到我的牌组中 也许我处

我正在写一个程序,其中我有一副卡片(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) ) );