簡體   English   中英

如何在C#中的linq的選擇中放置條件

[英]How to put a condition in the select of linq in C#

我想從 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 窗體中的復選框被勾選時才顯示 Schemes & Value,如果未勾選則只顯示空字符串

像這樣的東西

    .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 做到這一點?

要修改您選擇的內容,您必須瀏覽整個選擇。

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="";}
                                });

為什么不為您正在搜索的值嘗試條件運算符?

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

Checked 可能是一個 bollean 值或是否勾選了復選框。 我認為這會奏效

定義問題

您可以將其轉換為: 如果選中相應的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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM