C#:使用 Obj.getName() 将 List<string> 中的字符串与单独 List<Object> 中对象中的字符串属性进行比较

标签 c# algorithm list foreach compare

我正在编写一个程序,其中有一个卡片组(MyDeck 对象),其中包含一个列表(卡片类型列表),其中包含我的卡片(卡片对象)。 还有一个杂志(Magazine Object),里面有一张卡片列表(List of type string)待售。我想将杂志中的卡片添加到我的套牌中 除非我还没有卡。困难的部分是我的卡片是对象,而杂志中的卡片是字符串,所以我必须调用 mycard.getCardName() 为了得到我的卡片的名称和杂志中的卡片,我可以简单地在列表中运行,因为它们只是一个字符串列表。

这是我的代码,问题是只有杂志中的前 2 张牌被添加到我的套牌中。

也许我处理问题的方式不对。

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

最佳答案

// 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) ) );

关于C#:使用 Obj.getName() 将 List<string> 中的字符串与单独 List<Object> 中对象中的字符串属性进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164870/

相关文章:

c# - 如何将 FreeImage.dll 添加到 C# 项目

javascript - 寻找最长的回文

algorithm - 希尔伯特空间填充曲线重叠/重影节点

python - 创建位列表?

c# - 如何在C#中更改Windows窗体应用程序的主题

c# - 在 C# 中反序列化 Open Street Map JSON

c# - 用于接收自动短信通知的 AT 命令

algorithm - 算法和编程模型有什么区别?

python - 从 2 个单独的列表中提取信息

c++ - 清除 map 和删除内容的最简洁方法是什么?