如何通过DataTable搜索?

玻璃灯

众所周知的成员
加入
2019年11月22日
消息
126
编程经验
Beginner
有人可以给我一个关于如何通过DataTable寻找匹配数据的崩溃。我制作了一个简单的表的形象:

numpergridexample.png.


我忘了添加列标题,但假设标题是字母A,B,C和D.当我执行搜索时,我希望要检查的号码和任何相同的数字"AA匹配AD和DA使用4. AB与9.AC与CA和DB匹配5" etc

列数永远不会改变,但行将随着时间的推移而增加。我只是在询问如何实现搜索功能,而不是显示结果或其他任何东西(在某些时候可以弹出另一个东西),只想希望这个线程是激光专注于那个方面的激光这个的。

谢谢
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
你试过刚刚检查对的蛮力方法吗?

伪代码:
C#:
for (int row = 0; row < rowCount; row++)
{
    for (int col = 0; col < colCount; col++)
    {
        value = arr[row][col];

        startCol = col + 1;
        for (int i = row; i < rowCount; i++)
        {
            for (int j = startCol; j < colCount; col++)
            {
                if (arr[i][j] == value)
                    record value match between i,j and row,col
            }
            startCol = 0;
        }
    }
}
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
使用字典或哈希表有更复杂的方法。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
由于我正在等待别的东西来完成,这是字典或哈希表方法的伪代码:
C#:
entries = new Dictionary<int, List<Coordinates>();
for(int row = 0; row < rowCount; row++)
{
    for (int col = 0; col < colCount; col++)
        entries[arr[row][col]].Add(new Coordinate(row, col));
}

foreach(var value in entries.Keys)
{
    if (entries[value].Count > 1)
        Print coordinates found in entries[value]
}
 

玻璃灯

众所周知的成员
加入
2019年11月22日
消息
126
编程经验
Beginner
还有一件事,我现在意识到我正在展示错误,而不是"AA匹配AD和DA使用4. AB与9.AC与CA和DB匹配5"它应该是这样的"4:AA,广告(由于它是相同的)。 9:AB,ED。 5:CA,DB。"

如果我错了,或者如果有更简单的方式,请告诉我,但我知道如何通过用字典在整个搜索过程中存储这一点<int, List<customCoordinates>>。第一列和标题将是字符串,这些字符串将是"coordinates"int,因此当发现int时,int成为键,字符串是值,如果在搜索中的稍后点匹配到该int的较多匹配,则发现坐标字符串可以简单地添加到列表中<customCoordinates>在适当的int键。

我假设没有一个物体已经可以使用,所以要使用基于两个字符串的自定义协调类是正确的方式吗?
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,154
地点
挪威
编程经验
10+

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
我喜欢元组,因为它们非常方便这样的东西。最初,他们最常用于游戏开发,但他们现在正在使用越来越多的应用程序。如果您希望具有不同的结果,则可以使用重载。

嗯,假设这与您的其他最近的线程有关,如果"A"具有多种可能性或结果,然后重载元组将是良好的用途,特别是如果您有字符串字典,元组:
C#:
            var x = Tuple.Create<object, object, object, object, object, object>(null, null, null, null, null, null);
            Dictionary<string, Tuple<object, object, object, object, object, object>> d = new Dictionary<string, Tuple<object, object, object, object, object, object>>();
            d.Add("A", x);
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
4:AA,广告(由于它是相同的)。
它们是怎么样的?广告是第1行,第4列,而DA是第4行,第1列。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
没有很多可以解释。这只是创建元组,这是:
C#:
元组.Create<object, object, object, object, object, object>(null, null, null, null, null, null);
与此相同:
C#:
元组.Create<object, object>(null, null);
除此之外更容易使用。由于它没有过载,它需要您插入自己的对象和值。

按照 @Johnh. 您的其他主题上的其他代码。他有 : var methods = new Dictionary<string, Action>()

C#:
Dictionary<string, Tuple<object, object>> d = new Dictionary<string, Tuple<object, object>>();
所以当你声明你的字典时,你有一个词典<string, Tuple<Action, Action>>();
但是,您对此帖子的元组只有两个值,但在上面的示例中,您可以将其重载以对元组有许多值,但您还需要替换具有操作的对象。就像这是过载的一样:

C#:
            var x = Tuple.Create<object, object, object, object, object, object>(null, null, null, null, null, null);
            Dictionary<string, Tuple<object, object, object, object, object, object>> d = new Dictionary<string, Tuple<object, object, object, object, object, object>>();
            d.Add("A", x);
您需要将对象拍摄并用动作替换它们并提供调用的方法。用要存储在元组中的值替换null。
在我有对象的地方,将是各种各样的行动,就像上面展示的约翰一样。
因此,当您将字符串和元组添加到字典时,它会如下所示:
C#:
d.Add("A", x);
其中x是您的超载元组,其中包含对应于字典键的调用的不同变体的不同变体"A".

在调试器中运行代码,您将看到它的工作原理。在我的签名中调试链接您是否需要在教程中进行修复。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
想象一下,你有一个名叫A的盒子,盒子A可以保存2个对象(框A也是您的字典)。所以你把两个较小的盒子放入大盒子里。所以现在Box A由Box B和C组成,这是较小的盒子。其中box b是字典键,您的字符串和框C是您的元组。 Box C允许您存储大量较小的小项目。 (那些较小的项目是您的元组值。)这些项目是您的方法,或操作呼叫。绘制我在一张纸上解释的东西,看看它,然后它将在理解在C#中的物体内部存储对象的情况下,并应该更有意义,并采取这种方法将更好地帮助您了解对象方向编程概念一点点好。

希望快速类比有所帮助。
 

玻璃灯

众所周知的成员
加入
2019年11月22日
消息
126
编程经验
Beginner
由于我正在等待别的东西来完成,这是字典或哈希表方法的伪代码:
C#:
entries = new Dictionary<int, List<Coordinates>();
for(int row = 0; row < rowCount; row++)
{
    for (int col = 0; col < colCount; col++)
        entries[arr[row][col]].Add(new Coordinate(row, col));
}

foreach(var value in entries.Keys)
{
    if (entries[value].Count > 1)
        Print coordinates found in entries[value]
}

我正在尝试这样做,但我的数据是DataTable而不是数组。我一直在努力将整个东西复制到2D阵列中,以便我的情况更紧密地匹配您的代码。你能告诉或告诉我如何将它复制到数组中?
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
If your data is in a DataTable, presumably the data came from a database. You should really let the database do the searching for you because that is what databases are built for: fast queries/searches.

But if you really must search a DataTable there is always the brute force approach. Here's the pseudo-code:
C#:
var columns = table.Columns;
foreach(var row in table.Rows)
{
    foreach(var column in columns)
    {
        var value = row[column.ColumnName]
        if (value is the item you are looking for)
            Do something with the found item
    }
}
 

玻璃灯

众所周知的成员
加入
2019年11月22日
消息
126
编程经验
Beginner
谢谢你的Psiedocode Skydiver,它真的很有帮助。

If your data is in a DataTable, presumably the data came from a database. You should really let the database do the searching for you because that is what databases are built for: fast queries/searches.

DataTable是我的UI上DataGrid的数据源,这就是我使用DataTable的原因,我不使用数据库。也许我用错误的原因使用错误的事情?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,870
地点
切萨皮克,va.
编程经验
10+
如果您已经走下了WPF路径,大多数人Ditch DataSet和DataTable的并且只需使用List,DeviewableCollections,任何露出IEnumerable的任何东西。
 
最佳 底部