Методы LINQ можно использовать для извлечения одного элемента из списка ?

#c# #asp.net #list #linq

#c# #asp.net #Список #linq

Вопрос:

Это 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 ?

Комментарии:

1. Вам нужно взглянуть на содержимое stringB . В вашем списке есть один элемент, который является той строкой, которую вы получаете все время. Я не знаю, каким именно вы хотите, чтобы ваш список был.

2. Попробуйте следующее: DataRow row = dt . AsEnumerable() . Где(x => x.Field<string>(«p_uni») == «X4SVR»).FirstOrDefault(); строка p_int = (строка)строка[«p_int»];

Ответ №1:

Непонятно, почему вы возвращаете значение, которое вы уже запрашиваете, но:

 var value = dt.AsEnumerable().Select(z => z.Field<string>("p_uni")).FirstOrDefault(s => s.Contains("X4SVR"));
  

Комментарии:

1. спасибо за ответ, мне нужно вернуть значение, потому что мне нужно сравнивать со значением, извлеченным из таблицы базы данных. Возврат вашего предложения правильный, большое спасибо за эту помощь!

Ответ №2:

Это потому, что оба ваших списка содержат только один элемент (соединенных строк).

Не используйте 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"));