首页 > 解决方案 > LINQ 方法可用于从 List 中提取单个元素?

问题描述

这是一个datatable在 C# ASPNET 中

    DataTable dt = new DataTable();
    dt.Columns.Add("p_int", typeof(string));
    dt.Columns.Add("p_uni", typeof(string));

    dt.Rows.Add(new object[] { "0", "seat" });
    dt.Rows.Add(new object[] { "1", "X400" });
    dt.Rows.Add(new object[] { "4", "X400" });
    dt.Rows.Add(new object[] { "2", "X400" });
    dt.Rows.Add(new object[] { "2", "X4SVR" });
    dt.Rows.Add(new object[] { "3", "X400" });

使用 datatable 的值,我编译了两个不同的List<string>

    List<string> StringA = new List<string> { string.Join(", ", dt.AsEnumerable().Select(x => x.Field<string>("p_int")).Distinct()) };
    List<string> StringB = new List<string> { string.Join(", ", dt.AsEnumerable().Select(z => z.Field<string>("p_uni")).Distinct()) };

我需要从中X4SVR提取价值List<string> StringB并尝试

    var lb = StringB.FirstOrDefault(x => x.Contains("X4SVR"));
    Response.Write(lb.ToString() + "<br /><br />");

    var result = StringB.Where(x => x.Contains("X4SVR")).FirstOrDefault();
    Response.Write(result.ToString() + "<br /><br />");

    var content = StringB.FirstOrDefault(x => x.Contains("X4SVR")) ?? StringB.FirstOrDefault();
    Response.Write(content.ToString() + "<br /><br />");

    string ls_SearchVal = "X4SVR";
    var lobj_Result = StringB.All(o => o.Contains(ls_SearchVal));
    Response.Write(lobj_Result.ToString() + "<br /><br />");

    var value = StringB.Find(item => item.Contains("X4SVR")).ToString();
    Response.Write(value.ToString() + "<br /><br />");

回报绝不是唯一的X4SVR价值,而是

seat, X400, X4SVR

seat, X400, X4SVR

seat, X400, X4SVR

True

seat, X400, X4SVR

如何做只有价值的回报X4SVR

标签: c#asp.netlistlinq

解决方案


那是因为您的两个列表都只包含一个元素(连接字符串)。

请勿string.Join()用于此目的。相反,你想要这样的东西:

var StringA = dt.AsEnumerable().Select(x => x.Field<string>("p_int")).Distinct().ToList();
var StringB = dt.AsEnumerable().Select(z => z.Field<string>("p_uni")).Distinct().ToList();

然后,您可以使用以下方法获得您的价值:

var lb = StringB.FirstOrDefault(x => x.Contains("someString"));

推荐阅读