【问题标题】:If the list has a property that is again a list, get its first value如果列表具有再次是列表的属性,则获取其第一个值
【发布时间】:2015-01-29 09:24:34
【问题描述】:

我有一个ObjectsList(整数、字符串、日期等),我试图将此列表转换为DataTable。它工作得很好,直到我意识到我在列表中的对象实际上可以是Lists 本身。在这种情况下,我想获得他们的第一个值,否则我将在我的DataTable 中获得无意义的数据。

所以我需要一个 LINQ 查询来遍历一个通用列表,如果对象不是 List,则返回其值,但如果它返回其第一个值。所以最终我又得到了一个List,只不过这次它的所有成员都有一个值。

【问题讨论】:

  • 你能展示你的代码尝试吗?

标签: c# linq list datatable


【解决方案1】:

要处理任意深度嵌套,您需要一个小递归方法来检查对象是否为列表:

object GetValue(object obj)
{
    var list = obj as IList;
    if (list != null)
        return GetValue(list[0]);
    return obj;
}

那么过滤数据就这么简单:

var data = new List<object>
{
    1, "Foo",
    new List<object>{ new List<object>{ 2, 3, 4 }, "Bar" },
    5, 6
};

var filtered = data.Select(GetValue).ToList();

如果您确定列表中的列表不能包含列表本身,您也可以这样做

var filtered = data.Select(obj => obj is IList ? ((IList)obj)[0] : obj).ToList();

但是恕我直言,使用那个小辅助方法更清楚。

【讨论】:

    【解决方案2】:

    你可以使用 SelectMany()

        //Create lists of strings
        var a = new List<string> { "A", "B" };
        var b = new List<string> { "C", "D" };
        var c = new List<string> { "E", "F" };
    
        //Create a list containing all the lists
        var abc = new List<List<string>> { a, b, c };
    
        //Get the values
        var strings = abc.
            SelectMany(o => o).
            ToList();
    

    【讨论】:

    • OP 有一个List&lt;object&gt;,而不是List&lt;List&lt;string&gt;&gt;SelectMany 在这里不起作用。 strings 将是 A, B, C, D, E, F,而 OP 将需要 A, C, E
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2022-10-03
    • 2021-11-27
    • 1970-01-01
    • 2020-04-08
    • 2011-01-17
    相关资源
    最近更新 更多