代码之家  ›  专栏  ›  技术社区  ›  cori

方法链接泛型列表扩展

  •  1
  • cori  · 技术社区  · 15 年前

    我有一个“复杂”类型的列表——一个具有一些字符串属性的对象。列表本身是另一个对象的属性,包含各种类型的对象,如此缩写类结构所示:

    Customer {
       public List<Characteristic> Characteristics;
       .
       .
       .
    }
    
    Characteristic {
       public string CharacteristicType;
       public string CharacteristicValue;
    }
    

    List<Characteristic> interestCharacteristics = customer.Characteristics.FindAll(
       delegate (Characteristic interest) {
          return interest.CharacteristicType == "Interest";
       }
    );
    
    List<string> interests = interestCharacteristics.ConvertAll<string>(
       delegate (Characteristic interest) {
          return interest.CharacteristicValue;
       }
    );
    

    这很好,但似乎还有很长的路要走。我确信我一定错过了一个更简单的方法来获取这个列表,或者将FindAll()和Convert()方法链接在一起,或者其他我完全忽略的方法。

    作为背景,我在.NET2.0中工作,所以我仅限于.NET2泛型,而Characteristic类是一个外部依赖项-我无法改变它的结构来简化它,类的其他方面也很重要,只是与这个问题无关。

    欢迎任何指点或额外阅读。

    3 回复  |  直到 15 年前
        1
  •  1
  •   ShuggyCoUk    15 年前

    这是一个生成器实现

    public static IEnumerable<string> GetInterests(Customer customer)
    {
        foreach (Characteristic c in customer.Characteristics)
        {
            if (c.CharacteristicType == "Interest")
                yield return c.CharacteristicValue;
        }
    }
    

    遗憾的是,3.5扩展方法和lambda是根据您的需求而制定的,但以下是如何做到这一点的参考方法:

    customer.Characteristics
        .Where(c => c.CharacteristicType == "Interest")
        .Select(c => c. CharacteristicValue);
    
        2
  •  1
  •   BFree    15 年前

    我会手工做一些工作。通过先进行FindAll,然后进行Convert,可以在集合中循环两次。这似乎没有必要。如果在一天结束时,您只需要一个CharacteristicValue列表,那么只需在原始集合中循环,并将CharacteristicValue添加到符合条件的每个集合的列表中。大概是这样的:

         Predicate<Characteristic> criteria = delegate (Characteristic interest) 
         {
              return interest.CharacteristicType == "Interest";
         };
         List<string> myList = new List<string>();
         foreach(Characteristic c in customer.Characteristics)
         {
            if(criteria(c))
            {
                myList.Add(c.CharacteristicValue);
            }
         }
    
        3
  •  0
  •   Ricardo Villamil    15 年前

    为什么不创建一个 Dictionary<string, List<string>> ,这样您就可以添加“兴趣”作为键,并添加值列表作为值。例如:

    Customer {
       public Dictionary<string, List<string>> Characteristics;
       .
       .
       .
    }
    
    ...
    
    Characteristics.Add("Interest", new List<string>());
    Characteristics["Interest"].Add("Post questions on StackOverflow");
    Characteristics["Interest"].Add("Answer questions on StackOverflow");
    ..
    
    List<Characteristic> interestCharacteristics = Characteristics["Interest"];
    

    此外,如果您愿意,可以将您的特征限制为可能值的列表,方法是将其设置为枚举,然后将其用作字典键的数据类型:

    public enum CharacteristicType
    {
       Interest,
       Job,
       ThingsYouHate
    //...etc
    }
    

    然后将词典声明为:

    public Dictionary<CharacteristicType, List<string>> Characteristics;
    ..
    Characteristics.Add(CharacteristicType.Interest, new List<string>());
    Characteristics[CharacteristicType.Interest].Add("Post questions on StackOverflow");
    Characteristics[CharacteristicType.Interest].Add("Answer questions on StackOverflow");