【问题标题】:How to split a string in a datatable and add into new rows using Linq C#?如何使用 Linq C# 拆分数据表中的字符串并添加到新行中?
【发布时间】:2013-06-07 07:23:11
【问题描述】:

我是 linq 的新手。我正在使用 linq 从 datalist 控件中获取 vlaues 并使用该值创建数据表。数据表包含三列。在那里,有时“答案”列包含逗号分隔的数据。

            DataTable SaveAnswer = clsSource.SetData();
            var df = from DataListItem dli in PollDataList.Items
                     let z = ((HiddenField)dli.FindControl("IDReqHiddenField")) 
                     let y = ((RadioButtonList)dli.FindControl("rdblstPollOptions"))
                     let v = ((CheckBoxList)dli.FindControl("CheckBoxListMultiplePollOptions"))
                     select new
                     {
                         PollId=z.Value,
                         Answered1 = y.SelectedValue,
                         Answered2=v.Items.Cast<ListItem>().Where(r=>r.Selected)
                     };
           var result = from p in df
                         select SavePollAnswer.LoadDataRow(
                            new object[] { 
                                p.PollId,p.Answered1+string.Join( ", ", p.Answered2 ),""
                            },
                            false);
            SavePollAnswer = result.CopyToDataTable();

这是我的设计

<asp:DataList ID="PollDataList" runat="server"    CssClass="poll-preview">
        <ItemTemplate>
            <asp:HiddenField ID="PollIDReqHiddenField" Value='<%# Eval("PollID") %>' runat="server" Visible="false" />
            <asp:Label ID="lblReqQuestionNumber" runat="server" Text='<%# Eval("NoofPollQuestion") %>' Font-Bold="true"></asp:Label><br />
            <asp:Label ID="lblRequiredPollQusetion" runat="server" Text='<%# Eval("PollQuestions") %>' Font-Bold="false"></asp:Label>
            <asp:Label ID="lblReqNotification" runat="server" ForeColor="Red" CssClass='<%# Eval("PollReq") %>' Text="*" Font-Bold="true"></asp:Label>
            <asp:RadioButtonList ID="rdblstPollOptions" DataSource='<%# Eval("PollOptionsReq") %>' runat="server"></asp:RadioButtonList>
            <asp:CheckBoxList ID="CheckBoxListMultiplePollOptions" DataSource='<%# Eval("PollOptionsMul") %>'  runat="server" RepeatDirection="Vertical" RepeatColumns="1"></asp:CheckBoxList>
        </ItemTemplate>
    </asp:DataList>

但是我们想要这样的数据表输出

提前致谢!

【问题讨论】:

  • 我会用this 说明这一点吗?拆分具有 2 个值的值并添加新的 2 个新行。
  • 我想我必须更清楚地解释它......在第一张图片中,您可以看到“PollAnswer”列为“PollID”(36)选择了选项(2,3)。但我需要的输出不应该是这样的(36->2,3)。它应该是 36->2,36->3(你可以在第二张图片中看到)。
  • 是的,我明白了。在您构建new object[] 的位置,您需要查看 p.Answered2 是否不为空/空。如果不是,这意味着有一个逗号分隔的值要在单独的行中查看,请使用 p.Answered1 使用新对象执行第一次插入,然后再次使用另一行和 p.Answered2。

标签: c# asp.net linq


【解决方案1】:

LINQ 可以让你在查询中嵌套 from 子句(稍微简化输出):

from DataListItem dli in PollDataList.Items
let z = ... // as in existing code
let y = ...
let v = ...
from checkbox in v.Items
where checkbox.Selected
select new [] { z.Value, checkbox.Value, "" }

在这里,您将获得每个投票项(您的Answered2)中每个选定复选框的输出项。但是您还希望每个轮询项目的 Answered1 值的输出行,而这里 LINQ 的帮助较小。有两种方法可以做到这一点,使用Enumerable.Concat 的快速和丑陋的方法:

...
let v = ...
from answer in new [] { y.SelectedValue }.Concat(v.Items.Where(r => r.Selected)) // http://msdn.microsoft.com/en-us/library/bb302894.aspx
select new [] { z.Value, answer, "" }

或者更清晰、更通用但更长的方法,使用yield 创建一个iterator method,为您提供所有答案的项目:

from DataListItem item in PollDataList.Items
let z = ...
from answer in PollItemAnswers(item)
...
// outside the method containing the above
IEnumerable<object> PollItemAnswers(PollListItem item)
{
    var y = ...; // As in let statements
    var v = ...;
    yield return y.Value; // return the first answer
    foreach (var checkBox in v.Items)
        if (checkBox.Selected)
            yield return checkBox.Value; // return the other answers
}

最后,如果您的最终代码没有将项目分开(例如,它是从网络表单发布的),您可以使用string.Split()

 yield return y.Value;
 foreach (var answer in value.Split(',')) // "a, b, c" -> "a", " b", " c"
     yield return answer.Trim(); // " b" -> "b"

最后,请注意您的答案是否可能包含,!一般来说,使用 JSON 之类的东西来安全地移动值集合(比如从文件或另一台机器)将为您节省很多麻烦。

【讨论】:

  • 谢谢。我无法应用您的代码..请您指导我解决这个问题。
  • @Sudha:我无法回答有关DataTables 如何工作的问题,但您似乎已经做到了这一点。如果不清楚,... 是您现有代码的位置,我已经删除了答案不需要的内容。除此之外,唯一的区别是我结合了dfresult 查询。
  • @Sudha:我对示例代码进行了一些更改,但不清楚由于对答案不重要而被跳过的内容。也许我不明白 PollDataList.Items 包含什么?您在将查询结果输入SavePollAnswer 时遇到问题吗?
  • 感谢您的回复。我也添加了设计。 PollDataList 是一个包含隐藏字段、单选按钮列表和复选框列表控件的数据列表。从 datalist 读取值时,我将 CheckBoxList 的选定值作为 ListItem(Answered2)。我想要 DataTable 中的这些值。因此,当我将查询复制到数据表时,我将列表项设置为逗号分隔的字符串。我需要的不是逗号分隔,而是带有相应 pollId 的单独行。
  • 啊。那是因为 WebForms 既糟糕又陈旧。这就是为什么你有 from DataListItem dli in PollDataList.Items.Cast&lt;ListItem&gt;() 的类型 - 你可以使用 from ListItem checkbox in v.Itemsv.Items.Cast&lt;ListItem&gt;()
猜你喜欢
  • 2018-07-15
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多