【问题标题】:How to put a condition in the select of linq in C#如何在 C# 中的 linq 选择中放置条件
【发布时间】:2021-11-07 23:35:18
【问题描述】:

我想从 LINQ 中选择值

但是这些值取决于我在 C# 中的 windows 窗体中的另一个控件

这是我的代码

var lstInfo = grdBreakDown.Rows.Cast<DataGridViewRow>()
    .Where(x => !x.IsNewRow)
    .Select(x => (tag: x.Cells["tag"].Value.ToString(), Scheme: x.Cells["Scheme"].Value.ToString(), Value: x.Cells["Value"].Value.ToString()))
    .Distinct()
    .ToList();

lvwInfo.Items.AddRange( lstInfo
    .Select(x => new ListViewItem(new string[] { x.tag, x.Scheme, x.Value }))
    .ToArray()
);

此代码完美运行并显示所有类似这样的方案

    Tag  Scheme  Value
    Red  Master  88
    Red  Master  14
    Red  Admin   39
    Red  Admin   31
    Blue Master  91
    Blue Master  10
    Blue Admin   54
    Blue Admin   04

但我想进行一些更改,并且仅在选中 windows 窗体中的复选框时显示方案和值,如果未选中则仅显示空字符串

类似的东西

    .Select(x => (
        tag: x.Cells["tag"].Value.ToString(),
        Scheme:
            if(
                (!cbxMaster.checked &&  x.Cells["Scheme"].Value.ToString() == "Master")
                ||
                (!cbxAdmin.checked &&  x.Cells["Scheme"].Value.ToString() == "Admin"), "", x.Cells["Scheme"].Value.ToString()
            ),
        Value:
            if((!cbxMaster.checked &&  x.Cells["Scheme"].Value.ToString() == "Master")
                ||
                (!cbxAdmin.checked &&  x.Cells["Scheme"].Value.ToString() == "Admin"), "", x.Cells["Value"].Value.ToString()
            )
    )

因此,如果 Master 勾选了 Admin,则不会勾选

输出会是这样的

    Tag  Scheme  Value
    Red  Master  88
    Red  Master  14
    Red     
    Blue Master  91
    Blue Master  10
    Blue 

但这不起作用。

如何用 linq 做到这一点?

【问题讨论】:

  • 您的字符串文字未正确引用。我已经为你更正了。
  • 把数据库的工作交给数据库
  • @LeandroBardelli 控件是在windows窗体中决定的,是前端问题
  • “但这不起作用。” - 你有什么错误?

标签: c# linq


【解决方案1】:

要修改您选择的内容,您必须浏览整个选择。

var lstInfo = grdBreakDown.Rows.Cast<DataGridViewRow>()
                               .Where(x => !x.IsNewRow)
                               .Select(x => (tag: x.Cells["tag"].Value.ToString(), Scheme: x.Cells["Scheme"].Value.ToString(), Value: x.Cells["Value"].Value.ToString()))
                               .Distinct()
                               .ToList()
                               .foreach (elem=>{
                                     if(elem.Sheme.equals("Admin")){
                                         elem.Sheme="";
                                         elem.value="";}
                                });

【讨论】:

  • Distinct 在您的解决方案中的条件之前。但 distinct 必须在之后
  • 对于复杂性,最好是之前。所以 for each 循环不会无故迭代元素。
【解决方案2】:

为什么不对您要搜索的值使用条件运算符?

.Where(x => x.Cells["Scheme"].Value.ToString() == ((checked) ? "Master" : "Admin") )

Checked 可以是一个布尔值或是否勾选了复选框。我认为这会奏效

【讨论】:

  • 这是 where 条件,它将删除所有不匹配的条件
【解决方案3】:

定义问题

您可以将其转换为:如果选中了相应的 CheckBox 控件,则获取 Admin 和/或 Master 行的值。否则,获取他们不同的标签。

因此:

private void PopulateListView()
{
    // Local function...
    (string tag, string scheme, string value) GetItems(DataGridViewRow row) =>
        (chkAdmin.Checked && row.Cells["scheme"].Value.ToString() == "Admin") ||
        (chkMaster.Checked && row.Cells["scheme"].Value.ToString() == "Master")
        ? (
        row.Cells["tag"].Value.ToString(),
        row.Cells["scheme"].Value.ToString(),
        row.Cells["value"].Value.ToString())
        : (
        row.Cells["tag"].Value.ToString(),
        string.Empty,
        string.Empty);

    var lstInfo = dgv.Rows.Cast<DataGridViewRow>()
        .Where(x => !x.IsNewRow)
        .Select(x => GetItems(x))
        .Distinct()
        .Select(x => new[] { x.tag, x.scheme, x.value });

    lvwInfo.Items.Clear();
    lvwInfo.Items.AddRange(lstInfo.Select(x => new ListViewItem(x)).ToArray());
}

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多