代码之家  ›  专栏  ›  技术社区  ›  Mark Roworth

未知类型IEnumerable上的C#泛型foreach

  •  0
  • Mark Roworth  · 技术社区  · 2 年前

    我正在尝试编写一个通用静态函数,它接受IEnumerable类的一个实例、的一个属性名和一个字符串分隔符。它将在实例中循环,并与实例的每个成员一起计算属性,收集以分隔符隔开的单个字符串中返回的值。

    例如,如果我的集合类包含Person实例,属性名为“姓氏”,分隔符为“,”,我可能会返回:“Smith”、“Kleine”、“Beecham”。然后,我可能会用单引号将其括起来,并将其用作SQL中的列表。

    我的问题是我不知道如何迭代IEnumerable。到目前为止,我的代码是:

    public static string EnumerableItem2Str<T>(IEnumerable<T> oItems, string cPropertyName, string cSep)
    {
        string cOP = "";
                
        try
        {
            foreach (<T> oItem in oItems)
            {
                cOP += CoreHelper.GetPropertyValue(oItems, cPropertyName).ToString();
                if (oItem != oItems.Last()) cOP += cSep;
            }
            return cOP;
        }
        catch (Exception ex)
        {
            return "";
        }
    }
    
    public static object GetPropertyValue(object o, string cPropertyName)
    {
        return o.GetType().GetProperty(cPropertyName).GetValue(o, null);
    }
    
    

    我在电话里出错了 foreach (<T> oItem in oItems) 第一个是“预期类型” <T> .

    如何迭代 oItems 让每个实例都包含在其中?

    2 回复  |  直到 2 年前
        1
  •  1
  •   Calum Peebles    2 年前

    我想你应该这样做(它确实有一个空的传播检查,所以如果你使用的是旧版本的C#,那么你需要删除“.GetValue(I)”前面的问号):

    public static string EnumerableItem2Str<T>(IEnumerable<T> oItems, string cPropertyName, string cSep)
    {
        var propertyValues = oItems
            .Select(i => i.GetType().GetProperty(cPropertyName)?.GetValue(i))
            .Where(v => v != null)
            .ToList();
    
        return string.Join(cSep, propertyValues);
    }
    
        2
  •  1
  •   McNets    2 年前

    你可以这样做:

    static string GetCsv<T>(IEnumerable<T> items, string separator)
    {
        return String.Join(separator, items.Select(x => x.ToString()).ToArray());
    }
    

    检查一下 here